SQL日期比较查询逻辑正确但返回结果错误问题咨询
问题根因
你误用了DATE()函数的转换规则,触发了MySQL的隐式类型转换,导致实际比较逻辑和预期不符:
DATE()函数会将DATETIME类型的值截断为仅保留年月日的短日期格式,你表中schedule字段值为2021-11-13 08:59:00,经过DATE(schedule)处理后得到的结果是短字符串'2021-11-13',不包含时分秒信息。- 条件比较时MySQL会对不匹配的类型做隐式转换:此处短日期字符串会和右侧的长时间字符串
'2021-11-13 06:31:00'按字符串规则逐位比较,前10位的年月日内容完全一致,短字符串没有后续字符,长字符串还有空格加时分秒内容,因此'2021-11-13'的字符串排序优先级低于'2021-11-13 06:31:00'。 - 你写的
date(schedule) > '2021-11-13 06:31:00'实际等效于'2021-11-13' > '2021-11-13 06:31:00',结果为假,自然返回0条记录;改为<后比较结果为真,因此返回全部三条记录,和你观察到的现象完全一致。
修复方案
根据你的实际查询需求选择对应写法即可:
- 若需要保留时分秒的精度做比较,不需要套
DATE()函数,直接使用原生字段判断:
select * from `table_a` where `schedule` > '2021-11-13 06:31:00'
- 若确实只需要按日期维度比较,将右侧值也统一转换为日期格式,避免隐式转换误差:
-- 仅判断schedule的日期部分晚于2021-11-13 select * from `table_a` where date(`schedule`) > date('2021-11-13 06:31:00')
内容的提问来源于stack exchange,提问作者Erlisar Vasquez
相关产品推荐
相关产品推荐

