我有一个 String
,格式为:2018-11-01T00:00:00-07:00
,我想将其转换为TIMESTAMP
并将其插入{{1} }列。但是,当我插入它时,它会丢弃TIMESTAMP
而不先将其转换为-07:00
。如何确保将其正确转换并存储在Redshift中?
这里是一个示例:
-00:00
=> select ORIGINAL_DATE, TO_TIMESTAMP(ORIGINAL_DATE,'YYYY-MM-DD HH24:MI:SS') FROM CDW_LANDING.X where id = XXXXXX;
2018-11-01T00:00:00-07:00 2018-10-31 17:00:00
将其转换为我想要的TO_TIMESTAMP
。但是,当我插入它时,它变成2018-10-31 17:00:00
并简单地放下2018-11-01 00:00:00
。
这里是示例:
-07:00
但是当我用insert into cdw_stage.X (ORIG_DT)
select TO_TIMESTAMP(ORIGINAL_DATE,'YYYY-MM-DD HH24:MI:SS')
from CDW_LANDING.INVOICE where id = XXXXXX;
查询时,它显示select ORIG_DT from cdw_landing.X;
。我想看的是2018-11-01 00:00:00
函数应该执行的操作。
Redshift中的2018-10-31 17:00:00
为TO_TIMESTAMP
格式。输入日期在ORIG_DT
中。
如何让Redshift正确保存它?我还添加了postgres标记,因为Redshift基于postgres。非常感谢!!!
答案 0 :(得分:3)
2018-11-01T00:00:00-07:00
是timestamp
(timestamp without time zone
)文字, 不是 。它是timestamptz
(timestamp with time zone
)文字。这是所有问题困扰的根源。对timestamp
的错误转换将忽略偏移量。 The Postgres manual:
在已确定为
timestamp without time zone
的文字中,PostgreSQL将静默忽略任何时区指示。那 是,结果值是从 输入值,并且未针对时区进行调整。
强调粗体。
使用TO_TIMESTAMP()
不能拯救您。 The Redshift manual:
不支持包含时区(
TZ
,tz
或OF
)的格式作为输入。
(在Postgres中也是如此。)
以timestamptz
结尾(或使用该类型的列开头),其余应放在适当的位置:
SELECT cast('2018-11-01T00:00:00-07:00' AS timestamptz);
或者:
SELECT '2018-11-01T00:00:00-07:00'::timestamptz;
The manual about casting in Redshift.
将实际的timestamptz
分配给timestamp
列后,它将根据会话的当前timezone
设置自动进行转换。如果要使用其他目标时区,请使用AT TIME ZONE
构造。详细信息:
相关答案适用于Postgres,但Redshift中的时间戳处理(在许多其他方面有所不同!)是相同的。 The Redshift manual:
将DATE或TIMESTAMP转换为TIMESTAMPTZ时,DATE或TIMESTAMP 假定使用当前会话时区。会议时间 默认情况下,区域为UTC。有关设置会话的更多信息 时区,请参见timezone。