{"slug":"stock-market-hours","qid":"session_split","label":"A full trading day on the SPY tape, split by session window (recent full-length session)","post_title":"Stock Market Hours: Open 9:30, Close 4:00 ET","post_url":"/blog/stock-market-hours#q-session_split","columns":["session_date","weekday","regular_session_bars","first_bar_minute_of_day","last_bar_minute_of_day","first_bar_et","last_bar_et","total_shares_m","premarket_pct","regular_pct","post_close_30min_pct","evening_pct","first_30min_pct","last_30min_pct","midday_half_hour_pct"],"rows":[{"session_date":"2026-08-19","weekday":"Wednesday","regular_session_bars":390,"first_bar_minute_of_day":240,"last_bar_minute_of_day":1199,"first_bar_et":"04:00","last_bar_et":"19:59","total_shares_m":39,"premarket_pct":4.2,"regular_pct":79.5,"post_close_30min_pct":15.6,"evening_pct":0.7,"first_30min_pct":10.1,"last_30min_pct":20,"midday_half_hour_pct":5.2}],"shape":"scalar","sql":"WITH\n(\n    SELECT max(d)\n    FROM\n    (\n        SELECT\n            toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n            countIf((toHour(toTimeZone(window_start, 'America/New_York')) * 60\n                     + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n                AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n                     + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960) AS rth_bars\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= today() - 21\n          AND window_start < today() - 2\n        GROUP BY d\n        HAVING rth_bars = 390\n    )\n) AS session_day\nSELECT\n    toString(session_day)                     AS session_date,\n    formatDateTime(session_day, '%W')         AS weekday,\n    countIf(et_min >= 570 AND et_min < 960)   AS regular_session_bars,\n    min(et_min)                               AS first_bar_minute_of_day,\n    max(et_min)                               AS last_bar_minute_of_day,\n    formatDateTime(min(et_ts), '%H:%i')       AS first_bar_et,\n    formatDateTime(max(et_ts), '%H:%i')       AS last_bar_et,\n    round(sum(volume) / 1e6, 1)               AS total_shares_m,\n    round(100.0 * sumIf(volume, et_min < 570) / sum(volume), 1)                    AS premarket_pct,\n    round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 960) / sum(volume), 1)  AS regular_pct,\n    round(100.0 * sumIf(volume, et_min >= 960 AND et_min < 990) / sum(volume), 1)  AS post_close_30min_pct,\n    round(100.0 * sumIf(volume, et_min >= 990) / sum(volume), 1)                   AS evening_pct,\n    round(100.0 * sumIf(volume, et_min >= 570 AND et_min < 600) / sum(volume), 1)  AS first_30min_pct,\n    round(100.0 * sumIf(volume, et_min >= 930 AND et_min < 960) / sum(volume), 1)  AS last_30min_pct,\n    round(100.0 * sumIf(volume, et_min >= 750 AND et_min < 780) / sum(volume), 1)  AS midday_half_hour_pct\nFROM\n(\n    SELECT\n        volume,\n        toTimeZone(window_start, 'America/New_York') AS et_ts,\n        toHour(toTimeZone(window_start, 'America/New_York')) * 60\n        + toMinute(toTimeZone(window_start, 'America/New_York')) AS et_min\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) = session_day\n)","computed_at":"2026-08-22T04:22:17.587476+00:00","elapsed":0.136380395}