Dates & time Scalar

date_trunc()

Truncate to specified precision

Arguments & returns

4 overloads

date_trunc(part, timestamp)

Scalar
Overload link parttimestamp Returns
#01 VARCHARDATE TIMESTAMP
#02 VARCHARINTERVAL INTERVAL
#03 VARCHARTIMESTAMP TIMESTAMP
#04 VARCHARTIMESTAMP WITH TIME ZONE TIMESTAMP WITH TIME ZONE

Example

date_trunc example
SQL
Haybarn WASM 1.5.5-rc3 · In your browser

Engine example · Run to view results.

In a query

Give your timestamps a rhythm.

Group events into calendar months with date_trunc. The same pattern works for days, weeks, and years.

Give your timestamps a rhythm.
SQL
Haybarn WASM 1.5.5-rc3 · In your browser

Guide recipe · Run to view results.

In other engines

BigQuerydate_trunc()

SELECT DATE_TRUNC(DATE '2008-11-10', ISOWEEK)
In DuckDB
SELECT DATE_TRUNC('WEEK', CAST('2008-11-10' AS DATE))

SQLGlot example ↗

ClickHousetomonday()

toMonday(x)
In DuckDB
DATE_TRUNC('WEEK', x)

SQLGlot example ↗

Presto

SELECT ((DATE_ADD('week', -5, DATE_TRUNC('DAY', DATE_ADD('day', (0 - MOD((DAY_OF_WEEK(CAST(CAST(DATE_TRUNC('DAY', NOW()) AS DATE) AS TIMESTAMP)) % 7) - 1 + 7, 7)), CAST(CAST(DATE_TRUNC('DAY', NOW()) AS DATE) AS TIMESTAMP)))))) AS t1
In DuckDB
SELECT ((DATE_TRUNC('DAY', CAST(CAST(DATE_TRUNC('DAY', CURRENT_TIMESTAMP) AS DATE) AS TIMESTAMP) + INTERVAL (0 - ((ISODOW(CAST(CAST(DATE_TRUNC('DAY', CURRENT_TIMESTAMP) AS DATE) AS TIMESTAMP)) % 7) - 1 + 7) % 7) DAY) + INTERVAL (-5) WEEK)) AS t1

SQLGlot example ↗

SQL Serverdatetrunc()

SELECT DATETRUNC(month, foo)
In DuckDB
SELECT DATE_TRUNC('MONTH', foo)

SQLGlot example ↗

Snowflakedate_trunc()

Same function
Used in larger rewrites 1

These examples use date_trunc as one part of a larger SQL translation.

PostgreSQL

WITH dates AS (SELECT GENERATE_SERIES('2020-01-01'::DATE, '2024-01-01'::DATE, '1 day'::INTERVAL) AS date), date_table AS (SELECT DISTINCT DATE_TRUNC('MONTH', date) AS date FROM dates) SELECT * FROM date_table
In DuckDB
WITH dates AS (SELECT UNNEST(GENERATE_SERIES(CAST('2020-01-01' AS DATE), CAST('2024-01-01' AS DATE), CAST('1 day' AS INTERVAL))) AS date), date_table AS (SELECT DISTINCT DATE_TRUNC('MONTH', date) AS date FROM dates) SELECT * FROM date_table

SQLGlot example ↗