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

时间:2017-11-07 11:11:10

标签: amazon-redshift timestamp-with-timezone amazon-redshift-spectrum

我有一张表格timestamp存储为varchar。我需要使用timestamp将其转换为timezone,但每次出现"无效操作" 错误。

该字段的格式为:

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'))

All发出如下错误:

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

To 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)

答案 1 :(得分:0)

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

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'