2013-08-07 207 views
5

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

它似乎很直接,但有一些时区和夏令时错误。

我有一个脚本,每列生成我的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偏移量的解决方案吗?

+1

夏令时是一个不同的时区。例如。 CET是中欧时间,CEST是中欧夏令时。您的操作系统知道何时切换。只要您使用UTC来表示时间戳,就由表示层将其转换为本地时间。 –

回答

3

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

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

您可以设置连接/初始化时,一旦区:

SET time_zone = '+10:00'; 

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

​​

我不是很熟悉日期时间库,但我想他们使用您提供的时区和有问题的时间来确定时区和夏时制偏移量。

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

+0

我知道我可以使用时间戳,但我不能使用该类型。客户端需要与sqlite兼容,因此转换为INT。关于无效的时间;在夏令时结束时,您每天会有两次特定时间,这会产生同样的问题。 – Halfgaar

+0

相同的字符串表示形式存在多个时间点,也存在差距。我不认为你有什么可以做的。将您的值存储为unix时间戳(INT),并使用MySQL的函数或时间库客户端将它们转换为本地时间。只要你已经正确设置时区,它应该正确显示。 – Vatev

+0

我刚测试在TIMESTAMP列中插入'2005-03-27 02:00:00'。检索它也给你'2005-03-27 03:00:00',所以我想这很好。 – Halfgaar

相关问题