mariadb CURRENT_TIMESTAMP与查询中的DATETIME字段

piah890a  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我正在努力处理MariaDB 10.3中的时间值。特别是,我无法理解时间值何时根据配置的时区进行转换,何时不是。

CREATE TABLE aoeui (
    id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    created DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO aoeui () VALUES ();

SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui;

-- Note: I'm on CEST, which is currently +02:00 and the goal of this value
-- is just to be different from that to illustrate the behaviour.
SET TIME_ZONE = '+08:00';

SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui;

DROP TABLE aoeui;

-- reset timezone, so you can re-run the code in the same session
SET TIME_ZONE = 'SYSTEM';
  • 注意:插入和两个查询很容易在一秒内运行,所以任何时间戳最多应该在很短的运行时间内不同,我在这里称它们相等,尽管这不是100%正确(和一个种族条件)。

注2:两个值2023-08-15 14:26:47 +08002023-08-15 08:26:47 +0200描述同一时间点,只是以两种不同的方式。
在第一个SELECT查询中,结果两次显示相同的时间点。在第二个查询中,结果两次包含相同的时间点,仅表示不同的时区。然而,第二个查询只得到正确的CURRENT_TIMESTAMP值,从表中检索到的值的表示与第一个查询中的相同。

会话示例

Database changed
MariaDB [tmp]> CREATE TABLE aoeui (
    ->     id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->     created DATETIME DEFAULT CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.030 sec)

MariaDB [tmp]> INSERT INTO aoeui () VALUES ();
Query OK, 1 row affected (0.004 sec)

MariaDB [tmp]> SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui;
+----+---------------------+---------------------+
| id | created             | ts                  |
+----+---------------------+---------------------+
|  1 | 2023-08-15 08:26:47 | 2023-08-15 08:26:47 |
+----+---------------------+---------------------+
1 row in set (0.001 sec)

MariaDB [tmp]> SET TIME_ZONE = '+08:00';
Query OK, 0 rows affected (0.000 sec)

MariaDB [tmp]> SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui;
+----+---------------------+---------------------+
| id | created             | ts                  |
+----+---------------------+---------------------+
|  1 | 2023-08-15 08:26:47 | 2023-08-15 14:26:47 |
+----+---------------------+---------------------+
1 row in set (0.000 sec)

MariaDB [tmp]> DROP TABLE aoeui;
Query OK, 0 rows affected (0.010 sec)

您可以在第二个查询中看到,小时数从08更改为14,但只是针对其中一个结果。我本以为这两个方面都会有所改变。

rwqw0loc

rwqw0loc1#

MariaDB不会以TIMESTAMP类型存储时区。
如果您在MariaDB中更改了time_zone,后续操作将使用新的时间,但现有数据不会被更改。
如果您必须使用多个时区,您应该将时间存储为UTC时间戳。

CREATE TABLE aoeui (id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
                   created DATETIME DEFAULT UTC_TIMESTAMP());

要根据您所在的时区显示时间,请使用CONVERT_TZ()函数:

SELECT CONVERT_TZ(created, "+0:00", @@timezone) FROM aoeui;

欲了解更多信息,我建议阅读DATETIME documentation或观看Properly Handling Time and Date从安德鲁哈钦斯。

相关问题