datetrunc(day, order_date) 会令索引失效,应改用范围查询 where order_date >= '2026-09-17' and order_date
DATETRUNC在 SQL Server 2022 中按日截断,就是把时间部分(时、分、秒、纳秒)全部归零,只保留日期部分的起始时刻00:00:00.0000000,且不改变原始数据类型。别用
DATETRUNC(day, order_date)去过滤 WHERE 条件
- 这会让
order_date字段上的索引完全失效,执行计划变成全表扫描- 正确写法是用范围查询替代函数包裹:
WHERE order_date >= '2026-09-17' AND order_date- 如果你查的是变量或参数,也应提前算好边界:
@date是DATE类型时,用CAST(@date AS datetime2)和DATEADD(day, 1, CAST(@date AS datetime2))构造区间
day参数必须写全称,不能缩写为dd或d
DATETRUNC(dd, @dt)→ 报错:Incorrect syntax near ','DATETRUNC(day, @dt)→ 正确- 全小写、大小写混写都行(SQL Server 不区分大小写),但拼写必须精确;
DAY、Day、day都可以,DD不行返回值类型和精度跟输入一致,不是
DATE
- 输入是
datetime2(3),输出仍是datetime2(3),值如'2026-09-17 00:00:00.000'- 输入是
datetimeoffset(2),输出也是datetimeoffset(2),时区信息完整保留- 所以如果后续要 JOIN 或比较,类型兼容性没问题;但若想转成纯日期做展示,仍需显式
CAST(... AS DATE)真正容易被忽略的点是:很多人以为
DATETRUNC(day, ...)和CAST(... AS DATE)效果一样,其实前者保留类型和精度,后者强制转类型——在涉及计算列、索引视图或时区敏感场景下,行为差异会直接暴露。











