在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:00
或2013-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()不同