在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:00
或SET TIME ZONE INTERVAL '0:00' HOUR TO MINUTE
)。
我不能这样做,因为这是为视野计算的。实际时间戳来自文本表中的字段。
答案 0 :(得分:0)
这可能适用于所有时区:
VALUES TIMESTAMP(1364353339) + SESSION_TIMEZONE()
这些形式也是可能的:
VALUES TIMESTAMP(1364353339) + DATABASE_TIMEZONE()
VALUES TIMESTAMP(1364353339) + TIMEZONE()
DATABASE_TIMEZONE()可以与客户端 - 服务器设置中的会话不同。如果使用SET TIME ZONE,则TIMEZONE()可以与SESSION_TIMEZONE()不同