MySQL特定时间范围插入数据时出现无效日期时间格式错误求助
解决MySQL插入无效datetime的问题:夏令时导致的时间不存在错误
这个问题我之前踩过坑!核心原因是你要插入的2018-03-25 02:54:00在MySQL服务器的时区里根本是个不存在的时间——十有八九是夏令时(DST)切换搞的鬼。
为什么会出现这个错误?
以欧洲中部时间(CET/CEST)为例,2018年3月25日凌晨2点整,时钟会直接跳到3点,这意味着02:00-03:00之间的所有时间都是“不存在”的。MySQL对datetime的合法性校验很严格,遇到这种无效时间就会抛出SQLSTATE[22007]: Invalid datetime format: 1292错误。
具体解决方案
先确认服务器时区
执行这条SQL看看MySQL当前用的时区:SELECT @@global.time_zone, @@session.time_zone;如果结果是类似
Europe/Paris、CET这类带夏令时的时区,就坐实了是夏令时的问题。修复时间值
- 如果你是从用户输入或其他系统获取这个时间,要在应用层做有效性校验,确保生成的时间在目标时区是真实存在的;
- 直接把无效时间调整为切换后的有效时间,比如把
2018-03-25 02:54:00改成2018-03-25 03:54:00; - 最优实践:改用UTC时间存储
把应用层的时间统一转成UTC再插入数据库,读取时再根据用户需求转成对应时区。UTC没有夏令时切换,从根源上避免这类问题。
不推荐的应急方案(谨慎使用)
如果暂时没法改时间或时区,可以调整MySQL的sql_mode,去掉NO_ZERO_DATE和NO_INVALID_DATES:SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO';但这样MySQL会把无效时间自动转成
0000-00-00 00:00:00,可能导致数据不准确,所以只适合临时救急。
后续更新操作的注意点
如果后续更新也要涉及类似时间段,一定要提前检查时间的有效性,重点关注每年夏令时切换的日期(通常是3月最后一个周日和10月最后一个周日的凌晨),避免再次踩坑。
内容的提问来源于stack exchange,提问作者netpok
相关产品推荐
相关产品推荐

