{"slug":"us-stock-market-hours-german-time","qid":"intraday_profile","label":"intraday_profile","post_title":"us-stock-market-hours-german-time","post_url":"/blog/us-stock-market-hours-german-time#q-intraday_profile","columns":["et_time","german_time","avg_volume_millions","avg_range_pct"],"rows":[{"et_time":"09:00","german_time":"15:00","avg_volume_millions":0.23,"avg_range_pct":0.019},{"et_time":"09:30","german_time":"15:30","avg_volume_millions":4.06,"avg_range_pct":0.055},{"et_time":"10:00","german_time":"16:00","avg_volume_millions":2.94,"avg_range_pct":0.044},{"et_time":"10:30","german_time":"16:30","avg_volume_millions":2.51,"avg_range_pct":0.039},{"et_time":"11:00","german_time":"17:00","avg_volume_millions":2.66,"avg_range_pct":0.035},{"et_time":"11:30","german_time":"17:30","avg_volume_millions":2.03,"avg_range_pct":0.032},{"et_time":"12:00","german_time":"18:00","avg_volume_millions":1.84,"avg_range_pct":0.028},{"et_time":"12:30","german_time":"18:30","avg_volume_millions":1.61,"avg_range_pct":0.026},{"et_time":"13:00","german_time":"19:00","avg_volume_millions":1.65,"avg_range_pct":0.025},{"et_time":"13:30","german_time":"19:30","avg_volume_millions":1.46,"avg_range_pct":0.022},{"et_time":"14:00","german_time":"20:00","avg_volume_millions":1.88,"avg_range_pct":0.025},{"et_time":"14:30","german_time":"20:30","avg_volume_millions":2.28,"avg_range_pct":0.025},{"et_time":"15:00","german_time":"21:00","avg_volume_millions":2.64,"avg_range_pct":0.026},{"et_time":"15:30","german_time":"21:30","avg_volume_millions":7.7,"avg_range_pct":0.032},{"et_time":"16:00","german_time":"22:00","avg_volume_millions":5.06,"avg_range_pct":0.021},{"et_time":"16:30","german_time":"22:30","avg_volume_millions":0.29,"avg_range_pct":0.01}],"shape":"series","sql":"WITH\n    (\n        SELECT toHour(toTimeZone(toDateTime(concat(toString(max(date)), ' 12:00:00'), 'America/New_York'), 'Europe/Berlin')) - 12\n        FROM global_markets.stocks_daily_aggs\n        WHERE ticker = 'SPY'\n    ) AS german_offset_hours\nSELECT\n    formatDateTime(toDateTime(bucket_min * 60, 'UTC'), '%H:%i')                                            AS et_time,\n    formatDateTime(toDateTime(((bucket_min + german_offset_hours * 60) % 1440) * 60, 'UTC'), '%H:%i')       AS german_time,\n    round(sum(volume) / countDistinct(session_date) / 1e6, 2)                                              AS avg_volume_millions,\n    round(avg(bar_range_pct), 3)                                                                           AS avg_range_pct\nFROM\n(\n    SELECT\n        toDate(et)                                     AS session_date,\n        intDiv(toHour(et) * 60 + toMinute(et), 30) * 30 AS bucket_min,\n        volume,\n        toFloat64(high - low) / toFloat64(close) * 100  AS bar_range_pct\n    FROM\n    (\n        SELECT\n            toTimeZone(window_start, 'America/New_York') AS et,\n            volume,\n            high,\n            low,\n            close\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= today() - 60\n          AND window_start <  today() - 1\n    )\n    WHERE (toHour(et) * 60 + toMinute(et)) >= 540\n      AND (toHour(et) * 60 + toMinute(et)) <  1020\n)\nGROUP BY bucket_min\nORDER BY bucket_min","computed_at":"2026-09-26T15:27:20.451826+00:00","elapsed":0.154500295}