{"slug":"market-holidays-and-early-closes","qid":"tape_closures","label":"Recently-passed weekday closures, recovered from the SPY tape","post_title":"Stock Market Holidays 2026–2027: NYSE & Nasdaq","post_url":"/blog/market-holidays-and-early-closes#q-tape_closures","columns":["session_date","weekday","regular_session_bars"],"rows":[{"session_date":"2026-04-03","weekday":"Fri","regular_session_bars":0},{"session_date":"2026-05-25","weekday":"Mon","regular_session_bars":0},{"session_date":"2026-06-19","weekday":"Fri","regular_session_bars":0},{"session_date":"2026-07-03","weekday":"Fri","regular_session_bars":0}],"shape":"series","sql":"SELECT\n    toString(cal.day)                    AS session_date,\n    formatDateTime(cal.day, '%a')        AS weekday,\n    toUInt32(ifNull(t.bars, 0))          AS regular_session_bars\nFROM\n(\n    SELECT today() - 150 + arrayJoin(range(146)) AS day\n) AS cal\nLEFT JOIN\n(\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n        count()                                              AS bars\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= today() - 150\n      AND (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\n    GROUP BY d\n) AS t ON t.d = cal.day\nWHERE toDayOfWeek(cal.day) BETWEEN 1 AND 5\n  AND cal.day <= today() - 5\n  AND ifNull(t.bars, 0) = 0\nORDER BY cal.day","computed_at":"2026-08-25T13:00:06.837842+00:00","elapsed":0.312499431}