我们的日期存储为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时间戳。然而,MySQL方法from_unixtime
由于其整数类型限制,不支持大于2147483647
的值转换:
SELECT FROM_UNIXTIME(2147483647); //2038-01-19 04:14:07
SELECT FROM_UNIXTIME(2147483648); //null
MySQL服务器本身是64位的,但 FROM_UNIXTIME
函数需要接受一个长整型参数。
目前我还没有找到合适的替代方法,有任何提示吗?
我们当然可以将时间戳作为长整型加载并在应用程序中处理它 - 但是为了 lazyloading ,我们还需要在查询过程中正确地进行转换。
bigint
了吗? - juergen d