@@ -274,6 +274,44 @@ def get_server_version(self) -> Tuple[int, int, int]:
274274 """Return the SQL Server version this dialect is configured for."""
275275 return self .version
276276
277+ def format_date_trunc_expression (self , expr : "Any" ) -> Tuple [str , Tuple ]:
278+ source_sql , source_params = expr .source .to_sql ()
279+ field = expr .field .value .upper ()
280+ if field in {"YEAR" , "MONTH" , "DAY" , "HOUR" , "MINUTE" , "SECOND" }:
281+ sql = f"DATETRUNC({ field } , { source_sql } )"
282+ else :
283+ raise UnsupportedFeatureError (self .name , f"date_trunc({ expr .field .value } )" )
284+ return self ._apply_value_expression_modifiers (sql , source_params , expr )
285+
286+ def format_interval_expression (self , expr : "Any" ) -> Tuple [str , Tuple ]:
287+ raise UnsupportedFeatureError (
288+ self .name ,
289+ "standalone INTERVAL expression" ,
290+ "Use date_add() or date_sub() for SQL Server date arithmetic." ,
291+ )
292+
293+ def format_datetime_add_expression (self , expr : "Any" ) -> Tuple [str , Tuple ]:
294+ source_sql , source_params = expr .source .to_sql ()
295+ unit = expr .interval .unit .value .upper ()
296+ sql = f"DATEADD({ unit } , ?, { source_sql } )"
297+ return self ._apply_value_expression_modifiers (
298+ sql , (expr .interval .value ,) + source_params , expr
299+ )
300+
301+ def format_datetime_subtract_expression (self , expr : "Any" ) -> Tuple [str , Tuple ]:
302+ source_sql , source_params = expr .source .to_sql ()
303+ unit = expr .interval .unit .value .upper ()
304+ sql = f"DATEADD({ unit } , ?, { source_sql } )"
305+ return self ._apply_value_expression_modifiers (
306+ sql , (- expr .interval .value ,) + source_params , expr
307+ )
308+
309+ def format_datetime_diff_expression (self , expr : "Any" ) -> Tuple [str , Tuple ]:
310+ start_sql , start_params = expr .start .to_sql ()
311+ end_sql , end_params = expr .end .to_sql ()
312+ sql = f"DATEDIFF({ expr .unit .value .upper ()} , { start_sql } , { end_sql } )"
313+ return self ._apply_value_expression_modifiers (sql , start_params + end_params , expr )
314+
277315 def supports_collate_expression (self ) -> bool :
278316 """SQL Server supports expression-level COLLATE."""
279317 return True
0 commit comments