DATETRUNC(day, order_date) 会令索引失效,应改用范围查询 WHERE order_date >= '2026-09-17' AND order_date < '2026-09-18'。

DATETRUNC 在 SQL Server 2022 中按日截断,就是把时间部分(时、分、秒、纳秒)全部归零,只保留日期部分的起始时刻 00:00:00.0000000,且不改变原始数据类型。
别用 DATETRUNC(day, order_date) 去过滤 WHERE 条件
- 这会让
order_date字段上的索引完全失效,执行计划变成全表扫描 - 正确写法是用范围查询替代函数包裹:
WHERE order_date >= '2026-09-17' AND order_date < '2026-09-18'
- 如果你查的是变量或参数,也应提前算好边界:
@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) 效果一样,其实前者保留类型和精度,后者强制转类型——在涉及计算列、索引视图或时区敏感场景下,行为差异会直接暴露。

















