我有这种格式的String
:2018-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。非常感谢!!!
严格来说,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:,
TZ
或tz
)的格式不支持输入。
(Postgres也是如此。)
投射到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:。