Practical SQL

Rounding Timestamps in BigQuery

Constantin LunguUpdated 1 min read

Photo by Lukas Blazek on Unsplash

Have you ever encountered a situation where you would need to round a timestamp to the nearest second, 5 seconds or minute? While rounding a number is trivial, it's a little bit less straightforward when dealing with timestamps.

Let's consider the following input data.

BigQuery input data for rounding: a single event_time TIMESTAMP column with 10 rows between 2023-03-01 10:00:22.577 and 10:01:52.371 UTC, stored at millisecond precision.

We have our event_times that are at milliseconds-level grain. To round the times to the nearest granularity we'd like, we can use a combination of UNIX_MILLIS and TIMESTAMP_MILLIS.

The steps are as follows:

  • Transform the timestamp into milliseconds since Unix epoch (that is, number of milliseconds that have passed since January 1st, 1970) with UNIX_MILLIS

  • Divide that number by your target grain in milliseconds i.e. 1000 for 1 second or 60000 for 1 minute

  • CAST that number to an INT64

  • Multiply that number by your target grain (the number from above) i.e. 1000 for 1 second or 60000 for 1 minute

  • Transform it back to a timestamp using TIMESTAMP_MILLIS

SELECT 

event_time,
UNIX_MILLIS(event_time) AS epoch_milliseconds,
TIMESTAMP_MILLIS( CAST(UNIX_MILLIS(event_time) / 1000 AS INT64) * 1000) AS nearest_second,
TIMESTAMP_MILLIS( CAST(UNIX_MILLIS(event_time) / 5000 AS INT64) * 5000) AS nearest_5seconds,
TIMESTAMP_MILLIS( CAST(UNIX_MILLIS(event_time) / 60000 AS INT64) * 60000) AS nearest_1minute,
TIMESTAMP_MILLIS( CAST(UNIX_MILLIS(event_time) / 300000 AS INT64) * 300000) AS nearest_5minutes,

FROM input_data

Upon executing this query, the following results are produced:

BigQuery result of rounding event_time: columns event_time, epoch milliseconds (header cut off), nearest_second, nearest_5seconds, nearest_1minute and nearest_5minutes; for example 10:00:34.757 rounds to 10:00:35, 10:00:35, 10:01:00 and 10:00:00 UTC respectively.

The functions presented above and others relevant to working with timestamps are presented in the documentation.

Thanks for reading and enjoy working with BigQuery!