如何防止Redshift INSERT datetime丢弃时区?

问题描述 投票:1回答:1

我有这种格式的String2018-11-01T00:00:00-07:00,我想将它转换为TIMESTAMP并将其插入TIMESTAMP列。但是,当我插入它时,它会丢弃-07:00而不先将其转换为-00:00。如何确保将其正确转换并存储在Redshift中?

这是一个例子:select ORIGINAL_DATE, TO_TIMESTAMP(ORIGINAL_DATE,'YYYY-MM-DD HH24:MI:SS') FROM CDW_LANDING.X where id = XXXXXX;

=> Qazxswpoi

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这是2018-10-31 17:00:00函数应该做的。

Redshift中的TO_TIMESTAMP采用ORIG_DT格式。输入日期在TIMESTAMP

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

sql amazon-redshift
1个回答
3
投票

严格来说,VARCHAR不是2018-11-01T00:00:00-07:00文字。这是一个timestamp (timestamp without time zone)文字。这是你问题中所有痛苦的根源。对timestamptz (timestamp with time zone)的错误演员忽略了偏移。 timestamp

在已被确定为The Postgres manual:的文字中,PostgreSQL将默默地忽略任何时区指示。也就是说,结果值是从输入值中的日期/时间字段派生的,并且不针对时区进行调整。

大胆强调我的。

使用timestamp without time zone无法拯救你。 TO_TIMESTAMP()

包含时区(The Redshift manual:TZtz)的格式不支持输入。

(Postgres也是如此。)

Solution

投射到OF(或使用该类型的列开始),其余应该到位:

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中的时间戳处理(虽然在许多其他方面有所不同!)是相同的。 Ignoring time zones altogether in Rails and PostgreSQL

将DATE或TIMESTAMP转换为TIMESTAMPTZ时,假定DATE或TIMESTAMP使用当前会话时区。会话时区默认为UTC。有关设置会话时区的更多信息,请参阅The Redshift manual:

© www.soinside.com 2019 - 2024. All rights reserved.