{"slug":"market-data-timestamps-explained","qid":"bar_grid_drift","label":"Prints that change bar when you switch clocks, by bar length","post_title":"Market Data Timestamps: SIP vs Exchange Clocks","post_url":"/blog/market-data-timestamps-explained#q-bar_grid_drift","columns":["bar_length","moved_print_count","moved_pct"],"rows":[{"bar_length":"1 second","moved_print_count":8944,"moved_pct":8.966},{"bar_length":"10 seconds","moved_print_count":917,"moved_pct":0.919},{"bar_length":"1 minute","moved_print_count":130,"moved_pct":0.13},{"bar_length":"5 minutes","moved_print_count":24,"moved_pct":0.024}],"shape":"ranking","sql":"WITH\n    prints AS\n    (\n        SELECT\n            toUnixTimestamp64Nano(participant_timestamp) AS venue_ns,\n            toUnixTimestamp64Nano(sip_timestamp)         AS tape_ns\n        FROM global_markets.stocks_trades\n        WHERE ticker = 'AAPL'\n          AND sip_timestamp >= '2026-06-10 14:30:00'\n          AND sip_timestamp <  '2026-06-10 15:00:00'\n    ),\n    grids AS\n    (\n        SELECT arrayJoin([1, 10, 60, 300]) AS bar_seconds\n    )\nSELECT\n    multiIf(bar_seconds =  1, '1 second',\n            bar_seconds = 10, '10 seconds',\n            bar_seconds = 60, '1 minute',\n                              '5 minutes') AS bar_length,\n    countIf(intDiv(venue_ns, toInt64(bar_seconds) * 1000000000)\n         != intDiv(tape_ns,  toInt64(bar_seconds) * 1000000000)) AS moved_print_count,\n    round(100 * countIf(intDiv(venue_ns, toInt64(bar_seconds) * 1000000000)\n                     != intDiv(tape_ns,  toInt64(bar_seconds) * 1000000000)) / count(), 3) AS moved_pct\nFROM prints\nCROSS JOIN grids\nGROUP BY bar_seconds\nORDER BY bar_seconds ASC","computed_at":"2026-08-14T15:54:51.756946+00:00","elapsed":0.087399739}