1

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

所以可以说我的会话是在 UTC+1 并且我有一个来自其他地方的 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

I cannot do that as this is being computed for a view field. Actual timestamps are coming from a field on a text table.

4

1 回答 1

0

This will probably work in all time zones:

VALUES TIMESTAMP(1364353339) + SESSION_TIMEZONE()

These forms are also possible:

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

The DATABASE_TIMEZONE() can be different from the session in client-server setups. The TIMEZONE() can be different from SESSION_TIMEZONE() if SET TIME ZONE is used

于 2013-03-30T01:08:49.153 回答