The TIMESTAMP_TRUNC function in BigQuery will truncate the timestamp to the given date_part.
TIMESTAMP_TRUNC(timestamp_expression, date_part[, timezone])
Where date_part can be any of the following:
TIMESTAMP_TRUNC also supports the timezone parameter for the following date_parts:
Use this parameter if you want to use a time zone other than the default time zone, UTC, as part of the truncate operation.
Returns: TIMESTAMP
SELECT
CAST('2021-01-01 02:44:00 Europe/Berlin' AS TIMESTAMP) AS original_timestamp,
TIMESTAMP_TRUNC(CAST('2021-01-01 02:44:00 Europe/Berlin' AS TIMESTAMP), HOUR) AS hour,
TIMESTAMP_TRUNC(CAST('2021-01-01 02:44:00 Europe/Berlin' AS TIMESTAMP), MINUTE) AS minute,
TIMESTAMP_TRUNC(CAST('2021-01-01 02:44:00 Europe/Berlin' AS TIMESTAMP), YEAR) AS year
TIMESTAMP_TRUNC is very handy for aggregating your data by a particular date_part, like HOUR, while also accounting for different timestamps. See the example below to see how you can aggregate by HOUR:
SELECT
SUM(number) AS total,
TIMESTAMP_TRUNC(date, HOUR) AS hour
FROM
(
SELECT
CAST('2021-02-04 12:50:01-7:00' AS TIMESTAMP) AS date,
3 AS number
UNION ALL
( SELECT
CAST('2021-02-04 17:42:41+1:00' AS TIMESTAMP) AS date,
7 AS number)
UNION ALL
( SELECT
CAST('2021-02-04 17:01:00 Europe/Madrid' AS TIMESTAMP) AS date,
27 AS number)
) AS table_3
GROUP BY
hour
Make sure you've included your TIMESTAMP_TRUNC column in your GROUP BY!
TIMESTAMP('2021-02-04 12:50:01','Australia/Sydney')
------------
2021-02-04 01:50:01 UTC
The TIMESTAMP function allows you to convert a string to a TIMESTAMP given a certain timezone.
To convert a TIMESTAMP to seconds, or any date_part, we can use TIMESTAMP_TRUNC:
TIMESTAMP_TRUNC('2015-12-04 12:05:33',SECOND) second
You can also use FORMAT_TIMESTAMP or EXTRACT to format your results differently:
SELECT
'2015-12-04 12:05:33' AS original_ts,
TIMESTAMP_TRUNC(CAST('2015-12-04 12:05:33' AS TIMESTAMP), SECOND) AS truncated,
FORMAT_TIMESTAMP('%S', CAST('2015-12-04 12:05:33' AS TIMESTAMP)) AS formatted,
EXTRACT(SECOND FROM CAST('2015-12-04 12:05:33' AS TIMESTAMP)) AS extracted
The difference is the types that are returned:
You'll need to make sure you're using the right function for your data type. To use TIMESTAMP_TRUNC, you must be working with a TIMESTAMP, and not a DATE, DATETIME, or TIME.
You can use CAST to change your other date types to TIMESTAMP, or use one of the equivalent functions for other date types like DATE_TRUNC.