MySQL中STR_TO_DATE转换ISO8601日期后查询无结果问题
问题排查与修复方案
嘿,我一眼就发现你查询里的两个关键错误,这就是为啥查不到数据的原因:
1. 列名被当成了字符串常量
你写的STR_TO_DATE('last_ship_date', '%Y-%m-%dT%TZ')里,'last_ship_date'是带单引号的字符串,MySQL会把它当成普通文本,而不是去读取orders表中对应的列值。想象一下,你让MySQL把字符串"last_ship_date"转换成日期,这肯定转不出来,结果是NULL,自然不会有任何匹配结果。
修正方式:去掉列名的单引号,直接写列名:STR_TO_DATE(last_ship_date, '%Y-%m-%dT%TZ')
2. 日期格式符用错了(24小时制vs12小时制)
你用来对比的右侧日期转换里,用了%h这个格式符——它是用来匹配12小时制的小时(比如01-12),但你的时间是21:13:14,属于24小时制的时间,这时候应该用%H(匹配00-23的小时)。如果用%h的话,21会被识别成无效值,转换结果也是NULL,这也会导致对比失效。
修正方式:把右侧的格式符改成%H:STR_TO_DATE('2020-06-27 21:13:14', '%Y-%m-%d %H:%i:%s')
修复后的完整查询
把这两个问题都改好之后,查询语句应该是这样的:
SELECT * FROM `orders` WHERE STR_TO_DATE(last_ship_date, '%Y-%m-%dT%TZ') >= STR_TO_DATE('2020-06-27 21:13:14', '%Y-%m-%d %H:%i:%s');
额外优化建议:处理时区问题
因为你的last_ship_date是带UTC时区标记(Z)的ISO 8601格式,为了确保时间对比的准确性,建议把UTC时间转换为你会话使用的时区再对比,比如:
SELECT * FROM `orders` WHERE CONVERT_TZ(STR_TO_DATE(last_ship_date, '%Y-%m-%dT%TZ'), '+00:00', @@session.time_zone) >= '2020-06-27 21:13:14';
这样可以避免时区差异导致的意外结果。
内容的提问来源于stack exchange,提问作者Eran Levi
相关产品推荐
相关产品推荐

