【问题标题】:Mysql converting TIMESTAMP to INTEGER - timezonesMysql 将 TIMESTAMP 转换为 INTEGER - 时区
【发布时间】: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 作为时间戳,就由表示层将其转换为本地时间。

标签: mysql timestamp dst


【解决方案1】:

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

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

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

SET time_zone = '+10:00';

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

SELECT timestamp_column FROM table ...

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

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

【讨论】:

  • 我知道我可以使用时间戳,但我不能使用那种类型。客户端需要与 sqlite 兼容,因此转换为 INT。以及关于无效时间;在夏令时结束时,每天两次为您节省一定的时间,这会有同样的问题。
  • 有多个时间点具有相同的字符串表示,也有间隙。我认为您对此无能为力。将您的值存储为 unix 时间戳 (INT),并使用 MySQL 的函数或时间库客户端将它们转换为本地时间。只要您正确设置了时区,它就应该正确显示。
  • 我刚刚测试了在 TIMESTAMP 列中插入“2005-03-27 02:00:00”。检索它也会给你'2005-03-27 03:00:00',所以我想这很好。
  • 想要 INT 的一个原因 stackoverflow.com/questions/1646171/…
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 2016-08-07
  • 2013-12-04
  • 2021-04-20
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多