gpt4 book ai didi

mysql - 在 MySQL 中插入行时,CURRENT_TIME 时间戳不正确,我使用的是 AWS RDS

转载 作者:行者123 更新时间:2023-11-30 21:35:45 26 4
gpt4 key购买 nike

编辑:这是我使用 node-mysql2 的 mysql 库的问题

我正在使用 AWS RDS 来托管 MySQL 数据库。

我的数据库中有一列定义如下

创建于 TIMESTAMP DEFAULT CURRENT_TIMESTAMP

当我在美国东部时间下午 4:43 插入一行时,我得到该列的以下值

2018-12-27T02:43:32.000Z

当我尝试将此值转换为 EST 时,我得到了

12/26/2018,下午 9:43:32

这是不正确的。

我做错了什么或者我需要配置什么吗?

最佳答案

我认为这个测试很有趣,虽然它没有回答你的问题,但它确实将节点库排除在外。

CREATE DATABASE IF NOT EXISTS test;
USE test;

CREATE TEMPORARY TABLE t (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
created DATETIME DEFAULT CURRENT_TIMESTAMP,
tz varchar(32)
);

select "datetime";

SET time_zone = "CST6CDT";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "EST5EDT";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "UTC";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "CST6CDT";
select *, @@SESSION.time_zone FROM t;

SET time_zone = "EST5EDT";
select *, @@SESSION.time_zone FROM t;

SET time_zone = "UTC";
select *, @@SESSION.time_zone FROM t;

DROP TEMPORARY TABLE t;

select "timestamp";

CREATE TEMPORARY TABLE t (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
tz varchar(32)
);

SET time_zone = "CST6CDT";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "EST5EDT";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "UTC";
insert into t (tz) values (@@SESSION.time_zone);

SET time_zone = "CST6CDT";
select *, @@SESSION.time_zone FROM t;

SET time_zone = "EST5EDT";
select *, @@SESSION.time_zone FROM t;

SET time_zone = "UTC";
select *, @@SESSION.time_zone FROM t;

我在这里创建了一个包含 DEFAULT CURRENT_TIMESTAMP 列的临时表。我将 session 变量分别设置为 CST、EST 和 UTC 以测试一些不同的本地时区,然后插入 session 时区以跟踪哪个时区创建了哪个值。然后,我再次选择它们并将每个时区设置为我的 session 时区,以显示插入 session 的时区和选择 session 的时区如何相互作用。

然后我再次执行整个操作,与之前完全相同,但我第二次创建了包含 TIMESTAMP 字段的列,而不是 DATETIME。

我在一个 docker 容器中运行它只是为了测试,我从它开始:

docker run --rm -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql

但是从任何可以访问服务器的 mysql 客户端运行应该很容易;这是我的 docker exec 调用:

$ docker exec -i mysql mysql -t  < t.sql
+----------+
| datetime |
+----------+
| datetime |
+----------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 11:07:05 | CST6CDT | CST6CDT |
| 2 | 2018-12-27 12:07:05 | EST5EDT | CST6CDT |
| 3 | 2018-12-27 17:07:05 | UTC | CST6CDT |
+----+---------------------+---------+---------------------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 11:07:05 | CST6CDT | EST5EDT |
| 2 | 2018-12-27 12:07:05 | EST5EDT | EST5EDT |
| 3 | 2018-12-27 17:07:05 | UTC | EST5EDT |
+----+---------------------+---------+---------------------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 11:07:05 | CST6CDT | UTC |
| 2 | 2018-12-27 12:07:05 | EST5EDT | UTC |
| 3 | 2018-12-27 17:07:05 | UTC | UTC |
+----+---------------------+---------+---------------------+
+-----------+
| timestamp |
+-----------+
| timestamp |
+-----------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 11:07:05 | CST6CDT | CST6CDT |
| 2 | 2018-12-27 11:07:05 | EST5EDT | CST6CDT |
| 3 | 2018-12-27 11:07:05 | UTC | CST6CDT |
+----+---------------------+---------+---------------------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 12:07:05 | CST6CDT | EST5EDT |
| 2 | 2018-12-27 12:07:05 | EST5EDT | EST5EDT |
| 3 | 2018-12-27 12:07:05 | UTC | EST5EDT |
+----+---------------------+---------+---------------------+
+----+---------------------+---------+---------------------+
| id | created | tz | @@SESSION.time_zone |
+----+---------------------+---------+---------------------+
| 1 | 2018-12-27 17:07:05 | CST6CDT | UTC |
| 2 | 2018-12-27 17:07:05 | EST5EDT | UTC |
| 3 | 2018-12-27 17:07:05 | UTC | UTC |
+----+---------------------+---------+---------------------+

如您所见,DATETIME 始终以 session 的本地时间存储。我不清楚如何知道是否将其转换为不同的时区,因为时区显然在内部存储为 UTC,但显然没有针对 SELECT session 的时区进行更正。

另一方面,时间戳的行为不同。在这些情况下,时间戳在选择时会正确转换为 SELECT 的 session 时间。我认为这通常是数据库客户端期望的行为(我设置了一个 session 时区,所以向我显示该 session 时区中的日期)。

简而言之,如果要存储本地时间,请使用datetime。如果要存储“绝对时间”,请使用时间戳。不确定这是否是一个好规则,但根据我的测试,这似乎是一个好方法。

当然,正如您所指出的,客户端确实仍然需要设置他们希望使用的时区。将所有内容设置为使用相同的时区可以避免整个问题:)

关于mysql - 在 MySQL 中插入行时,CURRENT_TIME 时间戳不正确,我使用的是 AWS RDS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53937509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com