【发布时间】:2015-08-04 14:06:12
【问题描述】:
我们将日期存储为 unix 时间戳。为了允许用户搜索某个日期 - 基于他的时区设置,我们曾经在查询中转换该时间戳,以确保搜索“2012-05-03”不会找到上一个/下一个的结果日期取决于用户设置的时区。
即如果日期存储为 2012-05-03 23:00 (UTC) 具有适当时区偏移量的用户搜索 2012-05-04 应该会找到此条目。
目前是这样完成的:
CONVERT_TZ(FROM_UNIXTIME(`javaTimeStampColumn`/1000),'+00:00','+00:00')
在哪里。偏移量是根据用户时区设置的。
我们目前面临的问题:Java 成功地将 2038 之后的日期存储为 unix-timestamp。然而,MySQL 方法 from_unixtime 不支持任何大于 2147483647 的值的转换,因为它的整数类型限制:
SELECT FROM_UNIXTIME(2147483647); //2038-01-19 04:14:07
SELECT FROM_UNIXTIME(2147483648); //null
MySQL 服务器本身是 64 位的,但是是 ofc。 FROM_UNIXTIME 需要接受 long as 参数。
我现在找不到合适的替代品,有什么提示吗?
我们可以。将时间戳加载为 Long 并在应用程序中处理它 - 但是对于 lazylaoding,我们还需要能够在查询期间正确转换它。
【问题讨论】:
-
有什么理由不将数据类型更改为
datetime? -
@juergend 是的,不幸的是,数据是由我们无法更改的应用程序的一部分创建的。 (第三方库)
-
您是否尝试将时间戳列的数据类型更改为
bigint? -
这个有一个10岁的bug/feature request。
-
是的,但您可能需要等到 2037 年才能使用它:)