MySQL中查询DateTime字段等于指定值的语句为何失效?
解决MySQL DateTime字段匹配指定值的问题
嘿,我之前也踩过MySQL DateTime匹配的坑,咱们来聊聊你遇到的问题~
首先,你说查询start_date等于指定值时失效,大概率是这几个原因:
常见原因
- 日期格式不匹配:MySQL的DateTime字段实际存储格式是
YYYY-MM-DD HH:MM:SS,虽然你看到的显示是05/03/2018 12:00:00,但这只是客户端的显示格式,不是数据库里的真实存储。如果你直接用'05/03/2018 12:00:00'作为查询条件,MySQL会把它当成月/日/年来解析,和实际存储的年-月-日格式不匹配,自然查不到。 - 隐式转换的坑:当你用非标准格式的字符串去匹配DateTime字段时,MySQL会尝试自动转换,但转换逻辑可能和你预期的不一样(比如日和月搞反),导致匹配失败。
- 精度问题:如果你的
start_date字段是DATETIME(n)类型(带毫秒/微秒精度),而你查询时只写了到秒,比如存储的是2018-03-05 12:00:00.123,那用='2018-03-05 12:00:00'就会因为精度不匹配查不到。
解决办法
针对这些问题,给你几个实用的解决方案:
1. 使用MySQL标准格式查询
直接用YYYY-MM-DD HH:MM:SS格式写查询条件,这是最稳妥的方式:
SELECT * FROM MeteoForecast AS MF WHERE MF.localization_id = [你的localization_id值] AND MF.start_date = '2018-03-05 12:00:00';
2. 用STR_TO_DATE转换查询条件
如果你手里的日期字符串是日/月/年格式,用STR_TO_DATE把它转成MySQL认可的格式再匹配:
SELECT * FROM MeteoForecast AS MF WHERE MF.localization_id = [你的localization_id值] AND MF.start_date = STR_TO_DATE('05/03/2018 12:00:00', '%d/%m/%Y %H:%i:%s');
这里的%d/%m/%Y %H:%i:%s对应你输入的日/月/年 时:分:秒格式,要和输入字符串完全对应哦。
3. 处理精度问题(如果存在)
如果字段带毫秒精度,要么查询时带上完整精度,要么用范围查询替代等于(更灵活):
-- 带上完整精度(如果知道具体值的话) SELECT * FROM MeteoForecast AS MF WHERE MF.localization_id = [你的localization_id值] AND MF.start_date = '2018-03-05 12:00:00.000'; -- 范围查询(匹配该秒内的所有记录,推荐) SELECT * FROM MeteoForecast AS MF WHERE MF.localization_id = [你的localization_id值] AND MF.start_date >= '2018-03-05 12:00:00' AND MF.start_date < '2018-03-05 12:00:01';
另外,你那条查询start_date晚于指定值的语句,只要用了标准日期格式,应该就能正常工作,比如:
SELECT * FROM MeteoForecast AS MF WHERE MF.localization_id = [你的localization_id值] AND MF.start_date > '2018-03-05 12:00:00';
范围查询对格式和精度的容忍度更高,所以不容易出问题~
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

