Mysql将时间戳转换为整数时区

Mysql将时间戳转换为整数时区,mysql,timestamp,dst,Mysql,Timestamp,Dst,我需要在MySQL(InnoDB)数据库中将一些时间戳字段转换为INT。我意识到将时间戳转换为INT是不寻常的,但我们仍然需要这样做:) 这似乎很简单,但也有一些时区和夏令时错误 我有一个脚本,可以为每列生成SQL代码。例如,它生成: ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); ALTER TABLE ala

我需要在MySQL(InnoDB)数据库中将一些时间戳字段转换为INT。我意识到将时间戳转换为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将转换为当前时区

但是关于这个场景的文档(CET中的夏令时):

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


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

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

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

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

SET time_zone = '+10:00';
然后你可以直接选择/更新你所在区域的时间

SELECT timestamp_column FROM table ...
我不太熟悉datetime LIB,但我想它们使用您提供的时区和相关时间来确定时区和夏令时偏移量


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

夏令时是不同的时区。CET是中欧时间,CEST是中欧夏季时间。你的操作系统知道何时切换。只要使用UTC作为时间戳,就要由表示层将其转换为本地时间。我知道我可以使用时间戳,但我不能使用那种类型。客户端需要与sqlite兼容,因此需要将其转换为INT.和大约无效时间;在夏令时结束时,您将一天两次确定一个时间,这将有相同的问题。有多个时间点具有相同的字符串表示形式,并且也存在间隙。我认为你对此无能为力。将值存储为unix时间戳(INT),并使用MySQL函数或时间库客户端将其转换为本地时间。只要你正确设置了时区,它就会正确显示。我刚刚测试了在时间戳列中插入'2005-03-27 02:00:00'。检索它也会给你“2005-03-27 03:00:00”,所以我想这很好。想要INTs的一个原因
SELECT timestamp_column FROM table ...