如何在 redshift 中将 varchar 数据类型字段转换为带有时区类型字段的时间戳?

How to convert a varchar data type field to a timestamp with time zone type field in redshift?

我有一个 table,其中 timestamp 存储为 varchar。我需要使用 timezone 将其转换为 timestamp 但每次出现 "Invalid Operation" 错误。

字段格式为:

2017-10-30 10:12:34:154 +1100

我尝试了以下方法:

'2017-10-30 10:12:34:154 +1100'::timestamptz
'2017-10-30 10:12:34:154 +1100'::timestamp
to_timestamp('2017-10-30 10:12:34:154 +1100')
to_date('2017-10-30 10:12:34:154 +1100')
to_timestamp(to_char('2017-10-30 10:12:34:154 +1100'))

都报了这样的错误:

[Amazon](500310) Invalid operation: function to_timestamp(character varying) does not exist;

有人可以帮忙吗?

Redshift 的 to_timezone 不支持偏移量,因此您需要按如下方式对其进行处理:

select DATEADD('ms',
           (SUBSTRING('2017-10-30 10:12:34:154 +1100',21,3 ))::int,
           (SUBSTRING('2017-10-30 10:12:34:154 +1100', 0,20) + SUBSTRING('2017-10-30 10:12:34:154 +1100', 24,6))::timestamp)

为了大家的利益,以下是我解决问题的方法。基本上,问题在于 redshift 中带有时区的时间戳可接受的语法是 '2017-10-30 10:12:34.154 +1100',其中毫秒在 '.' 之后。而不是在“:”之后。虽然,我不确定这一点。但这似乎是 redshift 文档中的唯一问题,并且稍微玩了一下。

substr_replace 在我的案例中不起作用,因为日期和时间的长度不断变化,就像这两个 -

'2017-10-30 10:12:34:154 +1100' , '2017-10-3 5:12:34:154 +1100'

所以,我拆分了所有三个字段,并在删除毫秒后以正确的语法将它们添加回去,因为我不需要那个。

(split_part(m.properties_date_time_tz,' ',1)||' '||substring(split_part(m.properties_date_time_tz,' ',2),0,length(split_part(m.properties_date_time_tz,' ',2))-3)||' '||split_part(m.properties_date_time_tz,' ',3))::timestamptz

其中 properties_date_time_tz 的值类似于 '2017-10-30 10:12:34:154 +1100'