如何从hsqldb中的unix时间戳获得正确的UTC时间戳



在hsqldb中,函数TIMESTAMP()返回一个WITHOUT TIME ZONE时间戳,该时间戳在进行任何进一步转换之前被调整为会话的时区。

所以让我们说我的会话是在UTC+1,我有一个unix时间戳1364353339(周三,27 Mar 2013 03:02:19 GMT,根据http://www.onlineconversion.com/unix_time.htm)来自其他地方。如果我调用:

VALUES( TIMESTAMP( 1364353339 ) AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE );

得到2013-03-27 02:02:19.000000+0:00。这有正确的tz,但实际值比它应该少一个小时。

我探索过的其他可能性

VALUES( TIMESTAMP( 1364353339 ) AT LOCAL ) --> 2013-03-27 03:02:19.000000+1:00
Value right, TZ wrong
VALUES CAST(TIMESTAMP(1364353339) AT TIME ZONE INTERVAL '0:00' HOUR TO MINUTE AS TIMESTAMP(0) WITH TIME ZONE); --> 2013-03-27 02:02:19+0:00
Value wrong, TZ right
VALUES CAST(TIMESTAMP(1364353339) AT LOCAL AS TIMESTAMP(0) WITH TIME ZONE) --> 2013-03-27 03:02:19+1:00
Value right, TZ wrong

如果会话的时区之前切换为UTC(例如SET TIME ZONE INTERVAL '0:00' HOUR TO MINUTE),所有这些都返回正确的值(2013-03-27 03:02:19+0:002013-03-27 04:02:19+1:00)。

我不能这样做,因为这是为视图字段计算的。实际的时间戳来自文本表上的字段。

这可能适用于所有时区:

VALUES TIMESTAMP(1364353339) + SESSION_TIMEZONE()

这些形式也是可能的:

VALUES TIMESTAMP(1364353339) + DATABASE_TIMEZONE()
VALUES TIMESTAMP(1364353339) + TIMEZONE()

DATABASE_TIMEZONE()可以与客户机-服务器设置中的会话不同。如果使用SET TIMEZONE,则TIMEZONE()可以与SESSION_TIMEZONE()不同

相关内容

  • 没有找到相关文章

最新更新