SQL中JSON_VALUE提取的日期与日期范围匹配无结果问题咨询
问题原因与解决方案
核心原因
你遇到的问题本质是字符串字典序比较 vs 日期逻辑比较的冲突,具体有两点:
- 格式不匹配导致字符串比较失效
JSON_VALUE返回的是ISO8601格式的字符串:'2023-10-05T22:34:13.7944869+00:00',而你的查询条件用的是'2023-10-05 23:59:59'(空格分隔日期和时间)。字符串比较时会逐字符匹配,T的ASCII码(84)远大于空格(32),所以整个JSON日期字符串会被判定为大于你的结束条件字符串,自然不在BETWEEN范围内。 - 毫秒精度的遗漏
就算格式一致,你的结束条件没有毫秒部分,默认等价于23:59:59.0000000,而JSON日期带有7位毫秒,若你的日期是2023-10-05T23:59:59.1234567+00:00,同样会被判定为大于结束条件。
解决办法
方法1:转换为日期类型比较(推荐)
将JSON中的日期字符串转换为带时区的日期类型(如datetimeoffset),让SQL按日期逻辑处理,同时自动解析时区信息:
WHERE TRY_CONVERT(datetimeoffset, JSON_VALUE(myrow.Value,'$.Date')) >= '2023-10-05 00:00:00' AND TRY_CONVERT(datetimeoffset, JSON_VALUE(myrow.Value,'$.Date')) < '2023-10-06 00:00:00'
用< '2023-10-06 00:00:00'代替<= '2023-10-05 23:59:59.9999999',可以彻底避免毫秒精度带来的遗漏问题。
方法2:统一字符串格式
如果坚持用字符串比较,需要让两边格式完全一致(包括时区和毫秒):
WHERE JSON_VALUE(myrow.Value,'$.Date') BETWEEN '2023-10-05T00:00:00.0000000+00:00' AND '2023-10-05T23:59:59.9999999+00:00'
内容的提问来源于stack exchange,提问作者Anil
相关产品推荐
相关产品推荐

