0

我有一个表,其中timestamp存储为varchar. 我需要将其转换为timestampwithtimezone但每次我收到“无效操作”错误。

该字段的格式为:

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;

有人可以帮忙吗?

4

2 回答 2

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)
于 2017-11-07T11:28:41.463 回答
0

为了所有人的利益,这就是我解决问题的方法。基本上,问题在于红移中带时区的时间戳的可接受语法是“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'

于 2017-12-04T11:14:39.700 回答