SQL Server中如何仅使用日期部分查询datetime类型数据
SQL Server datetime类型按纯日期维度查询实现方案
datetime类型本身包含完整的时分秒信息,直接和纯日期字符串做等值匹配时,SQL Server会自动将字符串转换为yyyy-MM-dd 00:00:00.000格式的datetime值,仅能匹配到当天零点整的记录,其余时段的数据都会被过滤掉,所以你现在的写法无法覆盖目标日期的全量数据,可以用以下几种方案实现需求:
方案1:转换为DATE类型比较(写法最简单,适合中小数据量场景)
SQL Server 2008及以上版本支持DATE纯日期类型,直接转换后比较即可:WHERE CAST(str_day AS DATE) = '2021-10-23' AND CAST(end_day AS DATE) = '2021-10-24'注意:这种写法会对字段做函数转换,如果str_day、end_day上建有查询索引,会导致索引失效,百万级以上大数据量查询不推荐。
方案2:时间范围匹配(性能最优,推荐全场景使用)
用左闭右开的时间区间覆盖目标日期的所有时分秒范围,不需要对字段做任何函数转换,可以正常命中索引,查询效率最高:WHERE str_day >= '2021-10-23' AND str_day < '2021-10-24' AND end_day >= '2021-10-24' AND end_day < '2021-10-25'方案3:CONVERT字符串转换(兼容SQL Server 2005及更早版本)
旧版本不支持DATE类型的情况下,可以用CONVERT函数把datetime转换为yyyy-MM-dd格式的字符串后比较:WHERE CONVERT(VARCHAR(10), str_day, 23) = '2021-10-23' AND CONVERT(VARCHAR(10), end_day, 23) = '2021-10-24'这种写法同样会导致索引失效,仅作为旧版本兼容方案使用。
另外你提到的2021-10-225属于非法日期格式,插入时SQL Server会直接报错无法入库,属于脏数据,建议先做数据清洗修正异常值。
内容的提问来源于stack exchange,提问作者hamed algazaly
相关产品推荐
相关产品推荐

