SQL中smalldatetime用字符串做BETWEEN筛选结果不符问题排查
问题原因
你的写法存在两个核心问题导致结果不符合预期:
- 日期字符串隐式解析存在歧义:SQL Server的日期字符串解析受实例/会话的
DATEFORMAT参数影响,如果当前会话默认格式为DMY(日/月/年),'2021-07-01'会被错误识别为2021年1月7日,'2021-08-01'会被识别为2021年1月8日,你插入的7月数据自然不在这个错误区间内。 BETWEEN语法的闭区间逻辑在日期筛选场景下存在天然缺陷:如果字段精度高于你写的边界值精度,很容易出现边界数据漏判/误判,更推荐使用左闭右开的区间写法。
修复方案
1. 使用无歧义的日期字符串格式
SQL Server中YYYYMMDD格式的日期字符串不受任何DATEFORMAT参数影响,永远会被正确解析,配合左闭右开的区间写法修改你的判断逻辑即可:
CASE WHEN b.MajDate >= '20210701' AND b.MajDate < '20210801' THEN 'YES' ELSE 'NO' END AS InRange
2. 主动做类型转换(可选,完全消除隐式转换风险)
如果需要彻底规避类型转换带来的不可控问题,可以主动把边界值转换为smalldatetime类型:
CASE WHEN b.MajDate >= CONVERT(smalldatetime, '20210701') AND b.MajDate < CONVERT(smalldatetime, '20210801') THEN 'YES' ELSE 'NO' END AS InRange
内容的提问来源于stack exchange,提问作者Ludovic Aubert
相关产品推荐
相关产品推荐

