gst_session_clock
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-29, from us-stock-market-hours-uae-time.
| session_label | offset_hours | gst_premarket_open | gst_regular_open | gst_early_close | gst_regular_close | gst_after_hours_end |
|---|---|---|---|---|---|---|
| Mon Oct 27, 2025 | 8 | 12:00 | 17:30 | 21:00 | 00:00 | 04:00 |
| Tue Oct 28, 2025 | 8 | 12:00 | 17:30 | 21:00 | 00:00 | 04:00 |
| Wed Oct 29, 2025 | 8 | 12:00 | 17:30 | 21:00 | 00:00 | 04:00 |
| Thu Oct 30, 2025 | 8 | 12:00 | 17:30 | 21:00 | 00:00 | 04:00 |
| Fri Oct 31, 2025 | 8 | 12:00 | 17:30 | 21:00 | 00:00 | 04:00 |
| Mon Nov 3, 2025 | 9 | 13:00 | 18:30 | 22:00 | 01:00 | 05:00 |
| Tue Nov 4, 2025 | 9 | 13:00 | 18:30 | 22:00 | 01:00 | 05:00 |
| Wed Nov 5, 2025 | 9 | 13:00 | 18:30 | 22:00 | 01:00 | 05:00 |
| Thu Nov 6, 2025 | 9 | 13:00 | 18:30 | 22:00 | 01:00 | 05:00 |
| Fri Nov 7, 2025 | 9 | 13:00 | 18:30 | 22:00 | 01:00 | 05:00 |
- Rows × columns
- 10 × 7
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
session_label |
text | 10 distinct values | |
offset_hours |
number | 8 to 9 | |
gst_premarket_open |
text | 2 distinct values (12:00, 13:00) | |
gst_regular_open |
text | 2 distinct values (17:30, 18:30) | |
gst_early_close |
text | 2 distinct values (21:00, 22:00) | |
gst_regular_close |
text | 2 distinct values (00:00, 01:00) | |
gst_after_hours_end |
text | 2 distinct values (04:00, 05:00) |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
WITH bars AS
(
SELECT
toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
toTimeZone(window_start, 'America/New_York') AS et_ts,
toTimeZone(window_start, 'Asia/Dubai') AS gst_ts,
toHour(et_ts) * 60 + toMinute(et_ts) AS et_minute,
toHour(gst_ts) * 60 + toMinute(gst_ts) AS gst_minute
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= toDateTime('2025-10-27 04:00:00', 'UTC')
AND window_start < toDateTime('2025-11-08 06:00:00', 'UTC')
),
offsets AS
(
SELECT
et_date,
anyIf(gst_minute - et_minute, et_minute = 570) AS gst_offset_minutes
FROM bars
GROUP BY et_date
HAVING countIf(et_minute = 570) > 0
)
SELECT
concat(formatDateTime(et_date, '%a %b '), toString(toDayOfMonth(et_date)), ', ', toString(toYear(et_date))) AS session_label,
toUInt8(intDiv(gst_offset_minutes, 60)) AS offset_hours,
formatDateTime(toDateTime(toUInt32((240 + gst_offset_minutes) % 1440) * 60, 'UTC'), '%H:%i') AS gst_premarket_open,
formatDateTime(toDateTime(toUInt32((570 + gst_offset_minutes) % 1440) * 60, 'UTC'), '%H:%i') AS gst_regular_open,
formatDateTime(toDateTime(toUInt32((780 + gst_offset_minutes) % 1440) * 60, 'UTC'), '%H:%i') AS gst_early_close,
formatDateTime(toDateTime(toUInt32((960 + gst_offset_minutes) % 1440) * 60, 'UTC'), '%H:%i') AS gst_regular_close,
formatDateTime(toDateTime(toUInt32((1200 + gst_offset_minutes) % 1440) * 60, 'UTC'), '%H:%i') AS gst_after_hours_end
FROM offsets
ORDER BY et_date
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.