【发布时间】:2013-08-08 16:35:37
【问题描述】:
我需要在我们的 MySQL (InnoDB) DB 中将一些 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);比较前后数据,结果看起来不错。
然后的想法是更改所有客户端软件以转换为 UTC 并在存储时使用该 INT。检索时,该 INT 将转换为当前时区。
但是关于这种情况的文档warn me(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 和操作系统通常如何处理夏令时?我知道我的电脑有它的 UTC 时钟,在夏季时间,操作系统增加了两个小时,而在冬季时间增加了一个。我假设它使用 UTC 时间来确定它是否是 DST。
那么,我该如何处理呢?唯一的解决方案是向数据库中添加字段以指定 DST 偏移量吗?
【问题讨论】:
-
夏令时是不同的时区。例如。 CET 是中欧时间,CEST 是中欧夏令时间。您的操作系统知道何时切换。只要您使用 UTC 作为时间戳,就由表示层将其转换为本地时间。