Hal*_*aar 11 mysql timestamp dst
我需要在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;
Run Code Online (Sandbox Code Playgroud)
如果我比较使用前后数据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)
Run Code Online (Sandbox Code Playgroud)
API和OS通常如何处理夏令时?我知道我的电脑有时钟在UTC和夏天,操作系统增加两个小时,冬天时间一个.我假设它使用UTC时间来确定它是否是DST.
那么,我该如何处理呢?是向数据库添加字段以指定DST偏移量的唯一解决方案吗?
您不需要将时间存储在INT中.MySQL的TIMESTAMP类型无论如何都会这样做(它使用标准的unix时间戳来存储时间)并且它们始终是UTC.
您只需设置会话时区,并在更新/选择时将所有TIMESTAMP列从/转换为您的区域.
您可以在连接/初始化时将区域设置一次:
SET time_zone = '+10:00';
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接选择/更新区域中的时间
SELECT timesamp_column FROM table ...
Run Code Online (Sandbox Code Playgroud)
我对datetime libs不是很熟悉,但我猜他们会使用你提供的时区和时间来确定时区和夏令时偏移.
在你提供的示例中,我认为其中一个值实际上是无效的,因为时钟假设从01:59:59跳到03:00:00和02:00:00从未实际发生过.在这种情况下,UNIX_TIMESTAMP函数可能返回最接近的秒.
| 归档时间: |
|
| 查看次数: |
30721 次 |
| 最近记录: |