MySQL CONCAT查询为datetime字段加2小时后返回分钟全为03的异常
问题产生原因
问题出在混淆了MySQL DATE_FORMAT 函数的占位符规则:
- 你用来格式化时间的格式串
%H:%m:%s中,%m对应的不是分钟值,是「两位数字表示的月份(01-12)」 - MySQL中表示两位数字分钟值的占位符是
%i,和月份的%m完全独立
拿你给出的测试值举例:
数据库存的原始时间是2021-03-11 04:44:18,加2小时偏移后得到的时间点是2021-03-11 06:44:18,用错误的%H:%m:%s格式化时:
%H取24小时制小时值,输出06,和你看到的正确小时值一致%m取对应日期的月份值,这条记录的月份是3月,所以固定输出"03",根本不会读取实际存储的44分钟——这就是为什么所有结果的分钟都统一显示03%s取两位秒值,输出18,和你看到的正确秒值一致
修复方法
你原来拆分三段做CONCAT拼接的写法是完全冗余的,不需要多次调用DATE_FORMAT拆拼内容,只需要先对原始时间做2小时偏移,再用正确的占位符一次性格式化即可,修正后的SQL:
SELECT DATE_FORMAT(DATE_ADD(dt_tracker, INTERVAL 2 HOUR), '%Y-%m-%d %H:%i:%s') AS dt_format, TYPE, event_desc, name, speed FROM gs_user_events_data
用修改后的SQL查询刚才的测试记录,输出会是2021-03-11 06:44:18,分钟值和原始存储一致,2小时偏移逻辑正常,不会再出现固定输出03分钟的问题。
内容的提问来源于stack exchange,提问作者eTrack
相关产品推荐
相关产品推荐

