{"slug":"how-to-find-a-stock-earnings-date","qid":"report_rhythm","label":"Spacing between each name's eight biggest overnight moves, July 2024 to June 2026","post_title":"How to Find a Stock's Earnings Date","post_url":"/blog/how-to-find-a-stock-earnings-date#q-report_rhythm","columns":["ticker","median_days_between","closest_pair_days","widest_pair_days","median_move_pct"],"rows":[{"ticker":"WMT","median_days_between":93,"closest_pair_days":38,"widest_pair_days":188,"median_move_pct":3.91},{"ticker":"MSFT","median_days_between":89,"closest_pair_days":3,"widest_pair_days":93,"median_move_pct":5.6},{"ticker":"COST","median_days_between":69,"closest_pair_days":1,"widest_pair_days":214,"median_move_pct":2.6},{"ticker":"JNJ","median_days_between":69,"closest_pair_days":2,"widest_pair_days":189,"median_move_pct":2.27},{"ticker":"KO","median_days_between":51,"closest_pair_days":4,"widest_pair_days":197,"median_move_pct":3.04},{"ticker":"AAPL","median_days_between":10,"closest_pair_days":3,"widest_pair_days":179,"median_move_pct":5.11},{"ticker":"NVDA","median_days_between":8,"closest_pair_days":1,"widest_pair_days":175,"median_move_pct":6.49}],"shape":"table","sql":"WITH daily AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n           argMin(close, window_start) AS first_price,\n           argMax(close, window_start) AS last_price\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'WMT', 'COST', 'KO', 'JNJ')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-07-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker, session\n),\novernight AS (\n    SELECT ticker,\n           session,\n           first_price,\n           lagInFrame(last_price) OVER (PARTITION BY ticker ORDER BY session\n                                        ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close\n    FROM daily\n),\nmoves AS (\n    SELECT ticker,\n           session,\n           abs(toFloat64(first_price) / toFloat64(prior_close) - 1) * 100 AS abs_gap_pct\n    FROM overnight\n    WHERE toFloat64(prior_close) > 0\n      AND abs(toFloat64(first_price) / toFloat64(prior_close) - 1) < 0.3\n),\nbiggest AS (\n    SELECT ticker,\n           session,\n           abs_gap_pct,\n           row_number() OVER (PARTITION BY ticker ORDER BY abs_gap_pct DESC) AS rk\n    FROM moves\n),\nspacing AS (\n    SELECT ticker,\n           session,\n           abs_gap_pct,\n           dateDiff('day',\n                    lagInFrame(session) OVER (PARTITION BY ticker ORDER BY session\n                                              ROWS BETWEEN 1 PRECEDING AND CURRENT ROW),\n                    session) AS days_between\n    FROM biggest\n    WHERE rk <= 8\n)\nSELECT ticker,\n       round(quantileDeterministic(0.5)(toFloat64(days_between), cityHash64(session)), 0) AS median_days_between,\n       min(days_between) AS closest_pair_days,\n       max(days_between) AS widest_pair_days,\n       round(quantileDeterministic(0.5)(abs_gap_pct, cityHash64(session)), 2) AS median_move_pct\nFROM spacing\nWHERE days_between BETWEEN 1 AND 400\nGROUP BY ticker\nORDER BY median_days_between DESC","computed_at":"2026-08-03T11:43:19.667146+00:00","elapsed":0.005229261}