这个具有时区示例的Teradata时间戳如何有意义?

时间:2019-04-17 15:01:47

标签: teradata teradata-sql-assistant

在teradata文档中说:

  

“假定某个安装位于PST时区,并且该时间是除夕夜,本地时间为1998-12-31 20:30。

     

内部显示时间的系统TIMESTAMP WITH TIME ZONE在内部为'1999-01-01 04:30-08:00'。”

这与我的理解不符。我认为它应该在内部'1999-01-01 04:30+00:00',因为它应该存储在UTC中。 或者,可以将其存储为具有-8偏移量的本地时间,但是此示例似乎将两者混合在一起。也许我误会了文字?

1 个答案:

答案 0 :(得分:0)

不确定这是否是答案,但是评论太久了。

“内部”存储部分非常容易引起误解。我们不在乎Teradata如何在内部存储任何内容。

我发现使用BTEQ看起来更容易,因为SQL Assistant至少在默认情况下不显示时区。因此,假设您已登录BTEQ ...

    --set session timezone to pst (GMT - 8)
    SET TIME  ZONE INTERVAL -'08:00' HOUR TO MINUTE ;
    create volatile table vt_foo ( 
    ts_w_zone  timestamp(0) with time zone, 
    ts_wo_zone timestamp) on commit preserve rows;
    insert into vt_foo 
    select
    cast('1998-12-31 20:30:00' as timestamp(0)),
    cast('1998-12-31 20:30:00' as timestamp);
select * from vt_foo;

当前两个值(带和不带tz)将匹配。

                ts_w_zone                  ts_wo_zone
-------------------------  --------------------------
1998-12-31 20:30:00-08:00  1998-12-31 20:30:00.000000

现在让我们将会话的时区更改为其他时区,然后看看我们得到了什么。

SET TIME  ZONE INTERVAL -'03:00' HOUR TO MINUTE ;
select * from vt_foo;

                ts_w_zone                  ts_wo_zone
-------------------------  --------------------------
1998-12-31 20:30:00-08:00  1999-01-01 01:30:00.000000

带区域的时间戳仍然相同。显示没有时区的时间会自动将其转换为您的会话时区,在此示例中为GMT -3。

编辑: 从技术上讲,Teradata实际上将时区的时间存储为GMT(1999-01-01 04:30:00),时区偏移量为(-8)。那是文档从中获取1999-01-01 04:30-08:00值的地方。但这不是它的显示方式。