SSMS查询datetime类型列使用日期作为WHERE条件返回0行问题
问题原因
- 核心原因是
datetime类型存储包含完整的时分秒信息,你在SSMS中看到的2018-09-05是工具的简化显示结果,并非真实存储值。如果对应行的DateTimeColumn列实际携带了非零点的时分秒(例如2018-09-05 09:15:32.456),精确匹配'2018-09-05 00:00:00.000'自然无法命中任何行。 - 少数情况和日期字符串的隐式转换规则有关:部分SQL Server实例的语言/日期格式设置会导致字符串转datetime时出现解析偏差,该场景出现概率极低。
解决方案
你可以选择以下任意一种方法实现查询2018-09-05全天所有数据的需求,优先推荐第一种避免索引失效:
- 方法1:使用时间范围过滤,这种写法可以命中
DateTimeColumn上的索引,性能最优
SELECT * FROM dbo.Commande WHERE DateTimeColumn >= '2018-09-05' AND DateTimeColumn < '2018-09-06';
- 方法2:转换日期部分匹配,适合对性能要求不高、列上无索引的场景
SELECT * FROM dbo.Commande WHERE CAST(DateTimeColumn AS DATE) = '2018-09-05';
- 验证方法:如果你想确认列的真实存储值,可以修改SSMS的显示格式,或者执行以下查询查看完整时分秒信息
SELECT CONVERT(VARCHAR(50), DateTimeColumn, 121) AS FullDateTime FROM dbo.Commande WHERE CAST(DateTimeColumn AS DATE) = '2018-09-05';
内容的提问来源于stack exchange,提问作者LeCanardNoir
相关产品推荐
相关产品推荐

