【问题标题】:How can I get correctly displaced UTC timestamp from a unix timestamp in hsqldb如何从 hsqldb 中的 unix 时间戳中正确获取 UTC 时间戳
【发布时间】:2013-03-20 17:17:31
【问题描述】:

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

假设我的会话是在 UTC+1 并且我有一个来自其他地方的 1364353339(格林威治标准时间,2013 年 3 月 27 日星期三 03:02:19,根据 http://www.onlineconversion.com/unix_time.htm)的 unix 时间戳。如果我打电话:

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)。

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

【问题讨论】:

    标签: timezone hsqldb unix-timestamp


    【解决方案1】:

    这可能适用于所有时区:

    VALUES TIMESTAMP(1364353339) + SESSION_TIMEZONE()
    

    这些形式也是可能的:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 2017-10-07
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      相关资源
      最近更新 更多