MySQL中datetime与timestamp比较结果异常如何无需显式转换修复
MySQL TIMESTAMP与DATETIME比较结果异常修复方案
核心原因
你遇到的比较结果不符合预期,本质是两类时间的时区处理逻辑不同:
TIMESTAMP带时区属性:存储时会把输入的时间按当前会话时区转成UTC存储,比较的时候又会转成当前会话时区的时间参与计算DATETIME不带时区属性:存储的就是输入的字面时间,全程不会做时区转换
当你直接比较两种类型时,MySQL会自动把DATETIME的值按当前会话时区转成UTC,再和TIMESTAMP的底层存储值对比。如果DATETIME存储时使用的时区和当前会话时区不一致,就会产生时间偏移,自然比较结果就不符合逻辑。
无需显式类型转换的解决方法
只要把当前会话的时区改成和DATETIME字段存储时使用的时区完全一致即可,不需要给字段加任何CAST/CONVERT类的显式转换函数:
- 如果你的
DATETIME存的是UTC时间,执行这条语句即可:
SET time_zone = '+00:00';
- 如果存的是东八区时间,就改成对应时区参数:
-- 偏移量写法,无需导入时区表也能生效 SET time_zone = '+08:00'; -- 命名时区写法,需要提前导入MySQL时区表才能使用 SET time_zone = 'Asia/Shanghai';
修改完成后再执行比较操作,结果就会符合预期。
补充说明
如果需要全局生效,可以直接修改MySQL配置文件my.cnf(或my.ini)中的default-time-zone参数,重启服务后所有新会话都会默认使用该时区,无需每次连接单独调整。
内容的提问来源于stack exchange,提问作者Kiyoshi
相关产品推荐
相关产品推荐

