如何仅通过SQL Server中的CAST(Date AS DATE)截断表时间部分实现纯日期查询?
- 内容介绍
- 相关推荐
本文共计731个文字,预计阅读时间需要3分钟。
能,而且是简洁、可靠的方法。在SQL Server 2008中,使用 `CAST(YourDateTimeColumn AS DATE)` 会丢弃时分秒,只保留年月日,返回一个不含时间的 `DATE` 类型的值。这种方法不依赖于字符串转换,也不调用大的转换函数,也不受语言/日期格式设置的影响。
为什么不用 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 本身有索引。
本文共计731个文字,预计阅读时间需要3分钟。
能,而且是简洁、可靠的方法。在SQL Server 2008中,使用 `CAST(YourDateTimeColumn AS DATE)` 会丢弃时分秒,只保留年月日,返回一个不含时间的 `DATE` 类型的值。这种方法不依赖于字符串转换,也不调用大的转换函数,也不受语言/日期格式设置的影响。
为什么不用 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 本身有索引。

