我正在努力处理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 +0800
和2023-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
,但只是针对其中一个结果。我本以为这两个方面都会有所改变。
1条答案
按热度按时间rwqw0loc1#
MariaDB不会以TIMESTAMP类型存储时区。
如果您在MariaDB中更改了time_zone,后续操作将使用新的时间,但现有数据不会被更改。
如果您必须使用多个时区,您应该将时间存储为UTC时间戳。
要根据您所在的时区显示时间,请使用
CONVERT_TZ()
函数:欲了解更多信息,我建议阅读DATETIME documentation或观看Properly Handling Time and Date从安德鲁哈钦斯。