SQL Server对两个字符串格式日期的比较处理机制是什么?
SQL Server字符串格式日期比较逻辑解答
问题1:执行SELECT * FROM X WHERE (date < '2001')时,比较两侧是否会隐式转换为DATE类型?
不会,本次比较全程按字符串字典序执行,没有发生隐式日期类型转换:
- 你存储的date字段是
YYYY-MM-DD格式的字符串,查询条件右侧的'2001'也是字符串类型,同类型比较时SQL Server不会触发隐式类型转换。 - 该查询结果符合预期的原因是:
YYYY-MM-DD格式的字符串首四位恰好是年份,字符串按位比较时,首四位小于'2001'的字符串刚好对应年份小于2001的日期,属于格式巧合带来的结果正确,并非日期比较的结果。
问题2:执行SELECT * FROM X WHERE (date < 'abcdefg')时,返回所有元组、反向比较无结果的原因是什么?
该现象本质还是字符串字典序比较的规则导致:
- SQL Server字符串排序规则中,数字字符的ASCII码(0-9对应48-57)远小于英文字母的ASCII码(小写a-z对应97-122)。
- 你的date字段所有值都以数字开头,而
'abcdefg'以字母开头,所以所有date字段的字符串排序优先级都低于'abcdefg',因此date < 'abcdefg'会返回全部数据,date > 'abcdefg'无符合条件的结果。 - 全程没有发生日期类型转换,所以不会抛出日期格式非法的异常。
问题3:显式将date字段转换为日期类型是否有价值?
要分场景判断:
- 如果是在查询时对date字段包函数做显式转换,比如写
WHERE CONVERT(DATE, date) < '2001-01-01',这种操作完全没有价值,甚至是负优化:字段上加函数后会无法命中该字段上的索引,SQL Server只能走全表扫描逐行转换后对比,性能远低于直接字符串比较。 - 如果是修改表结构,把date字段的类型直接改为DATE类型,价值极高:
- DATE类型存储仅占3字节,远小于
YYYY-MM-DD字符串的10字节,索引体积更小,对比、计算效率都远高于字符串。 - 可以避免格式依赖风险:当前字符串比较结果正确完全依赖
YYYY-MM-DD的格式巧合,一旦存储格式变为DD-MM-YYYY、YYYY/MM/DD等,字符串比较结果会完全不符合日期逻辑。 - 原生支持所有日期计算操作(比如取月份、加减天数、按周聚合等),不需要额外做类型转换。
- DATE类型存储仅占3字节,远小于
内容的提问来源于stack exchange,提问作者Geddi
相关产品推荐
相关产品推荐

