Skip to content

Conversation

@fivetran-amrutabhimsenayachit
Copy link
Collaborator

The WEEK unit in DATEDIFF produces different results between Snowflake and DuckDB due to fundamentally different calculation methodologies:

Snowflake: Counts the number of week boundaries crossed.

DuckDB: Performs floor(days_diff / 7) - integer division.


TRANSPILATION:
python3 -c "import sqlglot; print(sqlglot.transpile(\"SELECT DATEDIFF(WEEK, '2020-01-15', '2023-06-20') AS diff_weeks, DATEDIFF(WEEK, '2024-12-13', '2024-12-17') AS week_monday_cross, DATEDIFF(WEEK, '2024-12-15', '2024-12-16') AS week_same_week\", read='snowflake', write='duckdb')[0])"
SELECT DATE_DIFF('WEEK', CAST('2020-01-15' AS DATE), CAST('2023-06-20' AS DATE)) AS diff_weeks, DATE_DIFF('WEEK', CAST('2024-12-13' AS DATE), CAST('2024-12-17' AS DATE)) AS week_monday_cross, DATE_DIFF('WEEK', CAST('2024-12-15' AS DATE), CAST('2024-12-16' AS DATE)) AS week_same_week

DUCKDB:
duckdb -c "SELECT DATE_DIFF('WEEK', CAST('2020-01-15' AS DATE), CAST('2023-06-20' AS DATE)) AS diff_weeks, DATE_DIFF('WEEK', CAST('2024-12-13' AS DATE), CAST('2024-12-17' AS DATE)) AS week_monday_cross, DATE_DIFF('WEEK', CAST('2024-12-15' AS DATE), CAST('2024-12-16' AS DATE)) AS week_same_week"
┌────────────┬───────────────────┬────────────────┐
│ diff_weeks │ week_monday_cross │ week_same_week │
│   int64    │       int64       │     int64      │
├────────────┼───────────────────┼────────────────┤
│    178     │         0         │       0        │
└────────────┴───────────────────┴────────────────┘

To fix this, enable date_part_boundary for Snowflake DATEDIFF.

TRANSPILATION:
python3 -c "import sqlglot; print(sqlglot.transpile(\"SELECT DATEDIFF(WEEK, '2020-01-15', '2023-06-20') AS diff_weeks, DATEDIFF(WEEK, '2024-12-13', '2024-12-17') AS week_monday_cross, DATEDIFF(WEEK, '2024-12-15', '2024-12-16') AS week_same_week\", read='snowflake', write='duckdb')[0])"

SELECT DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2020-01-15' AS DATE)), DATE_TRUNC('WEEK', CAST('2023-06-20' AS DATE))) AS diff_weeks, DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-13' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-17' AS DATE))) AS week_monday_cross, DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-15' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-16' AS DATE))) AS week_same_week

DUCKDB:
"SELECT DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2020-01-15' AS DATE)), DATE_TRUNC('WEEK', CAST('2023-06-20' AS DATE))) AS diff_weeks, DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-13' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-17' AS DATE))) AS week_monday_cross, DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-15' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-16' AS DATE))) AS week_same_week"
┌────────────┬───────────────────┬────────────────┐
│ diff_weeks │ week_monday_cross │ week_same_week │
│   int64    │       int64       │     int64      │
├────────────┼───────────────────┼────────────────┤
│    179     │         1         │       1        │
└────────────┴───────────────────┴────────────────┘

@github-actions
Copy link
Contributor

github-actions bot commented Dec 19, 2025

SQLGlot Integration Test Results

Comparing:

  • this branch (sqlglot:RD-1069363-datediff, sqlglot version: RD-1069363-datediff)
  • baseline (main, sqlglot version: 28.5.1.dev15)

⚠️ Limited to dialects: snowflake

By Dialect

dialect main sqlglot:RD-1069363-datediff difference links
snowflake -> duckdb 622/1085 passed (57.3%) 624/1085 passed (57.5%) ⬆ improved by 0.2% full result / delta
snowflake -> snowflake 975/1085 passed (89.9%) 975/1085 passed (89.9%) No change full result / delta

Overall

main: 2170 total, 1597 passed (pass rate: 73.6%), sqlglot version: 28.5.1.dev15

sqlglot:RD-1069363-datediff: 2170 total, 1599 passed (pass rate: 73.7%), sqlglot version: RD-1069363-datediff

Difference: ⬆ improved by 0.1%

@georgesittas georgesittas changed the title feat(duckdb): Add transpilation support for DATE_DIFF function feat(duckdb)!: Add transpilation support for DATE_DIFF function Dec 19, 2025
@georgesittas georgesittas merged commit e7c1574 into main Dec 19, 2025
11 checks passed
@georgesittas georgesittas deleted the RD-1069363-datediff branch December 19, 2025 17:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants