如何在 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'
我有一个 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'