如何从hsqldb中的unix时间戳中正确移位UTC时间戳

时间:2013-03-29 23:07:14

标签: timezone hsqldb unix-timestamp

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

因此,假设我的会话是UTC + 1,我的unix时间戳为1364353339(2013年3月27日星期三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(例如2013-03-27 03:02:19+0:00),则所有这些值都会返回正确的值(2013-03-27 04:02:19+1:00SET TIME ZONE INTERVAL '0:00' HOUR TO MINUTE)。

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

1 个答案:

答案 0 :(得分:0)

这可能适用于所有时区:

VALUES TIMESTAMP(1364353339) + SESSION_TIMEZONE()

这些形式也是可能的:

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

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