首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MySQL返回关于夏时制更改的不正确的TIMESTAMPDIFF()结果?

问为什么MySQL返回关于夏时制更改的不正确的TIMESTAMPDIFF()结果?
EN

Stack Overflow用户
提问于 2021-11-09 18:58:36
回答 1查看 85关注 0票数 1

这在几天前从美国东部时间到东部时间的变化中突然出现。请注意,我们的DB位于ET中,而不是UTC,而我们的DB团队对改变这一点犹豫不决,因为多年来都是这样的。

代码语言:javascript
复制
$ mysql --login-path=local dst_test -e '                 
SELECT VERSION(),
@@global.system_time_zone,
TIMESTAMPDIFF(SECOND, "2021-11-07 01:59:59-04:00", "2021-11-07 01:00:01-05:00") as "Diff on 7th",
TIMESTAMPDIFF(SECOND, "2021-11-08 01:59:59-04:00", "2021-11-08 01:00:01-05:00") as "Diff on 8th";
'
+-------------------------+---------------------------+-------------+-------------+
| VERSION()               | @@global.system_time_zone | Diff on 7th | Diff on 8th |
+-------------------------+---------------------------+-------------+-------------+
| 8.0.27-0ubuntu0.20.04.1 | EST                       |       -3598 |           2 |
+-------------------------+---------------------------+-------------+-------------+

所以请注意,尽管时间偏移是在两个时间戳中给出的,但7号(夏时制生效时)的结果却是差了一个小时。

如果系统设置为UTC,则不会发生这种情况:

代码语言:javascript
复制
$ sudo timedatectl set-timezone "UTC"
$ sudo systemctl restart mysql.service 
$ mysql --login-path=local dst_test -e '
SELECT VERSION(),
@@global.system_time_zone,
TIMESTAMPDIFF(SECOND, "2021-11-07 01:59:59-04:00", "2021-11-07 01:00:01-05:00") as "Diff on 7th",
TIMESTAMPDIFF(SECOND, "2021-11-08 01:59:59-04:00", "2021-11-08 01:00:01-05:00") as "Diff on 8th";
'
+-------------------------+---------------------------+-------------+-------------+
| VERSION()               | @@global.system_time_zone | Diff on 7th | Diff on 8th |
+-------------------------+---------------------------+-------------+-------------+
| 8.0.27-0ubuntu0.20.04.1 | UTC                       |           2 |           2 |
+-------------------------+---------------------------+-------------+-------------+

这是预期的行为吗?服务器时区不应该对指定了显式偏移量的时间戳没有影响吗?

更新

按照要求,我添加了信息,以显示问题是如何在存储数据的“真实”系统中表现出来的。这显示了一个查询,该查询不正确地返回将来发生的一个5秒的旧条目。

代码语言:javascript
复制
$ sudo date -s "11/07/21 01:59:59" &&
mysql --login-path=local dst_test -e '
SELECT @@global.system_time_zone;
DROP TABLE IF EXISTS t;
CREATE TABLE t(ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
INSERT INTO t() VALUES();
' &&
sleep 5 &&
mysql --login-path=local dst_test -e '
SELECT @@global.system_time_zone;
SELECT ts, TIMESTAMPDIFF(SECOND, ts, NOW()) FROM t;
'
Sun 07 Nov 2021 01:59:59 AM EDT
+---------------------------+
| @@global.system_time_zone |
+---------------------------+
| EDT                       |
+---------------------------+
+---------------------------+
| @@global.system_time_zone |
+---------------------------+
| EST                       |
+---------------------------+
+---------------------+----------------------------------+
| ts                  | TIMESTAMPDIFF(SECOND, ts, NOW()) |
+---------------------+----------------------------------+
| 2021-11-07 01:59:59 |                            -3595 |
+---------------------+----------------------------------+

但是,如果我把日期改为8号而不是7号,结果就完全不同了:

代码语言:javascript
复制
$ sudo date -s "11/08/21 01:59:59" &&
mysql --login-path=local dst_test -e '
SELECT @@global.system_time_zone;
DROP TABLE IF EXISTS t;
CREATE TABLE t(ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
INSERT INTO t() VALUES();
' &&
sleep 5 &&
mysql --login-path=local dst_test -e '
SELECT @@global.system_time_zone;
SELECT ts, TIMESTAMPDIFF(SECOND, ts, NOW()) FROM t;
'
Mon 08 Nov 2021 01:59:59 AM EST
+---------------------------+
| @@global.system_time_zone |
+---------------------------+
| EST                       |
+---------------------------+
+---------------------------+
| @@global.system_time_zone |
+---------------------------+
| EST                       |
+---------------------------+
+---------------------+----------------------------------+
| ts                  | TIMESTAMPDIFF(SECOND, ts, NOW()) |
+---------------------+----------------------------------+
| 2021-11-08 01:59:59 |                                5 |
+---------------------+----------------------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-10 14:08:11

经过进一步的测试,我确信这是MySQL中的一个bug。我提交了以下两份bug报告,并已被验证为可由开发团队复制:

https://bugs.mysql.com/105515

https://bugs.mysql.com/105517

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69903607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档