【问题标题】:How to Get UTC Datetime from UNIX_TIMESTAMP() in MySQL如何从 MySQL 中的 UNIX_TIMESTAMP() 获取 UTC 日期时间
【发布时间】:2016-11-30 22:54:03
【问题描述】:

我想知道如何从 mysql 中的 unix_timestamp 获取 utc 日期时间。

但是,我不应该使用 CONVERT_TZ。

(因为无法在分区中使用时区功能。)

SQL 架构中出现错误...

CREATE TABLE `table` (
  `idx` BIGINT(20) NOT NULL,
  etc...
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(CONVERT_TZ(from_unixtime(`idx` >> 24), @@session.time_zone, '+00:00')) )
SUBPARTITION BY HASH ( MONTH(CONVERT_TZ(from_unixtime(`idx` >> 24), @@session.time_zone, '+00:00')) )
SUBPARTITIONS 12 (
    PARTITION p2016 VALUES LESS THAN (2016),
    PARTITION p2017 VALUES LESS THAN (2017),
    PARTITION p2018 VALUES LESS THAN (2018),
    PARTITION p2019 VALUES LESS THAN (2019),
    PARTITION p2020 VALUES LESS THAN (2020)
)

【问题讨论】:

  • 对不起...错误... UTC_TIMESTAMP 是 UNIX_TIMESTAMP..
  • idx colume 的最高 40 位是 UNIX_TIMESTAMP。
  • SUBPARTITION 和 BY HASH 几乎总是无用的;使用它们的目的是什么?

标签: mysql partitioning


【解决方案1】:

我认为你的问题不是CONVERT_TZ,而是FROM_UNIXTIME。

FROM_UNIXTIME 接受一个整数作为参数 - 这意味着 32 位。

如果您采用今天的 unix 时间戳:1480546792,右移 24 位 - 您刚刚超过了 unix_time 上有效参数的 32 位限制。

from_unixtime 只能处理高达 2147483647 的参数 - 这意味着它可以工作到 2038-01-19 04:14:07

我也遇到过这个问题,自 2002 年以来,“正在开发中”解决此问题。

在最终解决之前,您应该使用解决方法,使用date_add。而不是

from_unixtime (x)

使用

date_add(from_unixtime(0), INTERVAL x second)

结果:

SELECT from_unixtime (2147483647); //2038-01-19 04:14:07 
SELECT from_unixtime (2147483648); //NULL

SELECT date_add(from_unixtime(0), Interval 2147483647 second) //2038-01-19 04:14:07
SELECT date_add(from_unixtime(0), Interval 2147483648 second) //2038-01-19 04:14:08

【讨论】:

  • 感谢您的回答。但我的idx 列格式是(UNIX_TIMESTAMP()
  • @user212942 你能提供一个idx 的示例值吗,它在哪里失败?
【解决方案2】:

你在这里陷入困境。 每当您将TIMESTAMP 数据项呈现为日期/时间项时,MySQL 都会将其从 UTC 隐式转换为本地时间(本地时间由当前连接的 time_zone 设置控制。

这使得使用YEAR(timestamp) 控制分区变得不可行。您使用MySQL date and time functions 提取年份所做的几乎任何事情都将执行转换。这意味着任何此类转换都将是不确定的。这意味着您不能使用它来控制分区。

您可以使用UNIX_TIMESTAMP() DIV ( 365 * 24 * 60 *60) 或类似的年份来控制您的分区。这将是接近的、不精确的和确定性的。

或者您可以使用UNIX_TIMESTAMP() DIV 16777216 或UNIX_TIMESTAMP() >> 24 进行分区。那是 2 ^ 24。这是 194 天多一点。这是任意的。但是,如果年份是很好的划分间隔,那么这些时间段也是如此。而且,您已经在索引中使用了位域模型。

【讨论】:

  • 好的。。谢谢你的回答~
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多