在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
偏移量的本地时间,但是此示例似乎将两者混合在一起。也许我误会了文字?
答案 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值的地方。但这不是它的显示方式。