繁体   English   中英

Mysql 将 TIMESTAMP 转换为 INTEGER - 时区

[英]Mysql converting TIMESTAMP to INTEGER - timezones

我需要在我们的 MySQL (InnoDB) 数据库中将一些 TIMESTAMP 字段转换为 INT。 我意识到将 TIMESTAMP 转换为 INT 是不寻常的,但我们仍然需要这样做:)

这似乎很简单,但有一些时区和夏令时错误。

我有一个脚本可以为每列生成我的 SQL 代码。 例如,它生成:

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED;
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started);
ALTER TABLE alarmLog DROP started;
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0;

如果我使用select FROM_UNIXTIME(1291788036);比较前后数据select FROM_UNIXTIME(1291788036); ,结果看起来不错。

然后的想法是将所有客户端软件更改为转换为 UTC 并在存储时使用该 INT。 检索时,该 INT 将转换为当前时区。

但是随后文档警告我这种情况(CET 中的夏令时):

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 02:00:00') |
+---------------------------------------+
|                            1111885200 |
+---------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00');
+---------------------------------------+
| UNIX_TIMESTAMP('2005-03-27 03:00:00') |
+---------------------------------------+
|                            1111885200 |
+---------------------------------------+
1 row in set (0.00 sec)

API 和操作系统通常如何处理夏令时? 我知道我的 PC 有 UTC 时钟,在夏季,操作系统增加了两个小时,在冬季增加了一个小时。 我假设它使用 UTC 时间来确定它是否是 DST。

那么,我该如何处理呢? 是向数据库添加字段以指定 DST 偏移量的唯一解决方案吗?

您不需要将时间存储在 INT 中。 MySQL 的 TIMESTAMP 类型无论如何都会这样做(它使用标准的 Unix 时间戳来存储时间)并且它们总是在 UTC 时区。

您只需要设置会话时区,当您更新/选择它们时,所有 TIMESTAMP 列都会从/转换到您的区域。

您可以在连接/初始化时设置区域一次:

SET time_zone = '+10:00';

然后您可以直接选择/更新您所在区域的时间

SELECT timestamp_column FROM table ...

我对日期时间库不是很熟悉,但我猜他们使用您提供的时区和相关时间来确定时区和夏令时偏移。

在您提供的示例中,我认为其中一个值实际上是无效的,因为时钟应该从01:59:59跳到03:00:0002:00:00从未真正发生过。 在这种情况下, UNIX_TIMESTAMP 函数可能会返回最近的秒数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM