能,CAST(Date AS DATE)是最简洁可靠的截断时间方案;它直接返回DATE类型值,不依赖字符串转换、无函数开销、不受区域设置影响,但WHERE中直接使用CAST无法走索引,应改用范围查询。

CAST(Date AS DATE) 能否真正截断时间部分
能,而且是最简洁可靠的方案。SQL Server 2008+ 中 CAST(YourDateTimeColumn AS DATE) 会丢弃时分秒毫秒,只保留年月日,返回一个不含时间的 DATE 类型值。它不依赖字符串转换、不调用函数开销大的 CONVERT 变体,也不受语言/日期格式设置影响。
为什么不用 DATEADD/DATEDIFF 或 CONVERT(..., 101)
这些方法虽能“看起来”去时间,但存在隐式转换或性能隐患:
-
DATEADD(DAY, DATEDIFF(DAY, 0, YourDateTimeColumn), 0)计算冗余,执行计划中常出现额外计算节点 -
CONVERT(VARCHAR, YourDateTimeColumn, 101)先转字符串再比对,无法走索引(除非你建了计算列+索引),且易因区域设置出错(比如英国服务器上 101 可能被解释为 MM/DD/YYYY) - 所有字符串中间态操作都可能触发隐式转换,导致参数化查询缓存失效
直接 WHERE CAST(MyDateCol AS DATE) = '2024-03-15' 会走索引吗
一般不会——这是最容易踩的坑。SQL Server 无法在 CAST 表达式上直接使用普通索引,即使 MyDateCol 本身有索引。正确做法是改写为范围查询:
MyDateCol
- 用
DATE字面量:'2024-03-15'(ISO 格式,无歧义) - 避免用
GETDATE()直接比DATE,应写成CAST(GETDATE() AS DATE) - 注意
NULL值:CAST(NULL AS DATE)还是NULL,但别忘了在 WHERE 中处理空值逻辑
索引是否生效、类型是否对齐、字面量是否 ISO 格式——这三个点漏掉任何一个,都可能让本该毫秒级的查询变成秒级。










