Skip to content

Commit db5a7ce

Browse files
vistartclaude
andcommitted
feat(sqlserver): add datetime interval expression formatting
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 85add17 commit db5a7ce

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

  • src/rhosocial/activerecord/backend/impl/sqlserver

‎src/rhosocial/activerecord/backend/impl/sqlserver/dialect.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)