我想知道如何在mysql中从unix_timestamp中获取utc datetime。
但是,我不应该使用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)
)发布于 2016-12-01 07:10:44
我认为你的问题不是CONVERT_TZ,而是FROM_UNIXTIME。
FROM_UNIXTIME接受一个整数作为参数-这意味着32位。
如果你使用今天的unix-timestamp: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发布于 2016-12-01 07:30:29
你现在有麻烦了。无论何时将TIMESTAMP数据项呈现为日期/时间项,MySQL都会隐式地将其从协调世界时转换为本地时间(其中,本地时间由当前连接的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天多一点。这是武断的。但是,如果年份是良好的分区间隔,那么这些时间段也是如此。而且,您已经在索引中使用了位域模型。
https://stackoverflow.com/questions/40899761
复制相似问题