Skip to content

Commit d322fa6

Browse files
feat(duckdb)!: Add transpilation support for DATE_DIFF function (#6609)
1 parent 2c4d9e1 commit d322fa6

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

sqlglot/dialects/snowflake.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ def _build_object_construct(args: t.List) -> t.Union[exp.StarMap, exp.Struct]:
135135

136136
def _build_datediff(args: t.List) -> exp.DateDiff:
137137
return exp.DateDiff(
138-
this=seq_get(args, 2), expression=seq_get(args, 1), unit=map_date_part(seq_get(args, 0))
138+
this=seq_get(args, 2),
139+
expression=seq_get(args, 1),
140+
unit=map_date_part(seq_get(args, 0)),
141+
date_part_boundary=True,
139142
)
140143

141144

tests/dialects/test_snowflake.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2416,6 +2416,45 @@ def test_timestamps(self):
24162416
"DATEDIFF(DAY, CAST('2007-12-25' AS DATE), CAST('2008-12-25' AS DATE))",
24172417
)
24182418

2419+
# Test DATEDIFF with WEEK unit - week boundary crossing
2420+
self.validate_all(
2421+
"DATEDIFF(WEEK, '2024-12-13', '2024-12-17')",
2422+
write={
2423+
"duckdb": "DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-13' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-17' AS DATE)))",
2424+
"snowflake": "DATEDIFF(WEEK, '2024-12-13', '2024-12-17')",
2425+
},
2426+
)
2427+
self.validate_all(
2428+
"DATEDIFF(WEEK, '2024-12-15', '2024-12-16')",
2429+
write={
2430+
"duckdb": "DATE_DIFF('WEEK', DATE_TRUNC('WEEK', CAST('2024-12-15' AS DATE)), DATE_TRUNC('WEEK', CAST('2024-12-16' AS DATE)))",
2431+
"snowflake": "DATEDIFF(WEEK, '2024-12-15', '2024-12-16')",
2432+
},
2433+
)
2434+
2435+
# Test DATEDIFF with other date parts - should not use DATE_TRUNC
2436+
self.validate_all(
2437+
"DATEDIFF(YEAR, '2020-01-15', '2023-06-20')",
2438+
write={
2439+
"duckdb": "DATE_DIFF('YEAR', CAST('2020-01-15' AS DATE), CAST('2023-06-20' AS DATE))",
2440+
"snowflake": "DATEDIFF(YEAR, '2020-01-15', '2023-06-20')",
2441+
},
2442+
)
2443+
self.validate_all(
2444+
"DATEDIFF(MONTH, '2020-01-15', '2023-06-20')",
2445+
write={
2446+
"duckdb": "DATE_DIFF('MONTH', CAST('2020-01-15' AS DATE), CAST('2023-06-20' AS DATE))",
2447+
"snowflake": "DATEDIFF(MONTH, '2020-01-15', '2023-06-20')",
2448+
},
2449+
)
2450+
self.validate_all(
2451+
"DATEDIFF(QUARTER, '2020-01-15', '2023-06-20')",
2452+
write={
2453+
"duckdb": "DATE_DIFF('QUARTER', CAST('2020-01-15' AS DATE), CAST('2023-06-20' AS DATE))",
2454+
"snowflake": "DATEDIFF(QUARTER, '2020-01-15', '2023-06-20')",
2455+
},
2456+
)
2457+
24192458
self.validate_identity("DATEADD(y, 5, x)", "DATEADD(YEAR, 5, x)")
24202459
self.validate_identity("DATEADD(y, 5, x)", "DATEADD(YEAR, 5, x)")
24212460
self.validate_identity("DATE_PART(yyy, x)", "DATE_PART(YEAR, x)")

0 commit comments

Comments
 (0)