MySQL ADDTIME不知道如何切换到DST
今年由于切换到夏令时而大受欢迎。我假设ADDTIME在DST截止时间方面是安全的,但事实并非如此。我的错。。。我应该检查一下MySQL ADDTIME不知道如何切换到DST,mysql,dst,Mysql,Dst,今年由于切换到夏令时而大受欢迎。我假设ADDTIME在DST截止时间方面是安全的,但事实并非如此。我的错。。。我应该检查一下 +----------------------------------------------+ | ADDTIME('2015-03-29 01:55:32', '0 00:10:00') | +----------------------------------------------+ | 2015-03-29 02:05:32
+----------------------------------------------+
| ADDTIME('2015-03-29 01:55:32', '0 00:10:00') |
+----------------------------------------------+
| 2015-03-29 02:05:32 |
+----------------------------------------------+
在我的TZ中,2015-03-29 02:05:32不存在:它应该是2015-03-29 03:05:32
我提出的解决方案是将ADDTIME调用封装在CONVERT_TZ中:
有没有人想出更好/更安全的选择
SUBTIME、TIMEDIFF和任何按时进行数学运算的函数都有同样的问题
问候,,
Thierry您是否将数据保存到MySQL是不确定的。基本上,通过将所有与日期/时间相关的信息保存到时间戳列类型中,可以解决此问题。拉取数据后,使用用户的TZ显示正确的时间。同样的规则适用于查询时间戳列,强制用户输入UTC日期。由于你的问题通常是关于你提出的算法,我将此作为评论发布,我不知道它是否对你有帮助。谢谢。它是SELECT语句的一部分。目标是提供一些根据从数据库读取的值计算的日期时间信息。为了示例,我简化了调用,显示了切换到DST时发生的情况。ADDTIMEb.startT,“0 03:50:00”作为“STDFsetup4h”,是否为b.startT使用日期时间类型或时间戳?它是日期时间。。。但我已经测试过了,没什么区别。在这两种情况下:DATETIME或TIMESTAMP,选择AddTimeStart,“0 00:10:00”返回2015-03-29 02:05:32到2015-03-29 01:55:32加上10分钟。。。据我所知。。。除非我在某个地方做错了。一般来说,你不应该用本地日期/时间值来做数学计算——这正是你发现的原因。此外,您可能应该首先存储UTC值。时间戳转换只有在您认真考虑会话时区设置是否正确的情况下才有效。在许多情况下,您只需要将UTC值存储在DATETIME字段中,并在应用程序代码中进行转换。
+----------------------------------------------------------------------------------------------------------------+
| CONVERT_TZ(ADDTIME(CONVERT_TZ('2015-03-29 01:55:32','Europe/Paris','UTC'), '0 00:10:00'),'UTC','Europe/Paris') |
+----------------------------------------------------------------------------------------------------------------+
| 2015-03-29 03:05:32 |
+----------------------------------------------------------------------------------------------------------------+