如何防止Redshift INSERT日期时间掉落时区?

时间:2019-03-05 01:34:49

标签: sql amazon-redshift

我有一个 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:00TO_TIMESTAMP格式。输入日期在ORIG_DT中。

如何让Redshift正确保存它?我还添加了postgres标记,因为Redshift基于postgres。非常感谢!!!

1 个答案:

答案 0 :(得分:3)

严格来讲,

2018-11-01T00:00:00-07:00timestamp (timestamp without time zone)文字, 不是 。它是timestamptz (timestamp with time zone)文字。这是所有问题困扰的根源。对timestamp的错误转换将忽略偏移量。 The Postgres manual:

  

在已确定为timestamp without time zone的文字中,PostgreSQL将静默忽略任何时区指示。那   是,结果值是从   输入值,并且未针对时区进行调整

强调粗体。

使用TO_TIMESTAMP()不能拯救您。 The Redshift manual:

  

不支持包含时区(TZtzOF)的格式作为输入。

(在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