Redshift (SQL):尝试转换为时间戳
Posted
技术标签:
【中文标题】Redshift (SQL):尝试转换为时间戳【英文标题】:Redshift (SQL): try convert to timestamp 【发布时间】:2016-10-13 19:34:03 【问题描述】:我有一列带有时间戳作为字符串,如下所示:
starttime | attribute
2000-08-21T23:10:37Z | X
现在我想将这些字符串转换为 AWS Redshift 中的正确时间戳。 以下适用于上述示例中显示的行,
CAST(starttime as timestamp)
但有些行的格式不正确,因此引发异常:
error: Invalid data
code: 8001
context: Invalid format or data given:
有没有办法使用类似于 MS SQL 服务器中的 try_convert 的东西? 我尝试了以下方法但没有取得多大成功:
case when starttime ~ '\d1,4-\d1,2-\d1,2T\d1,2:\d1,2:\d1,2Z'
then cast(starttime as timestamp) else null end
但是这个正则表达式不起作用..还尝试使用 [[:digit:]] 代替 \d 或 \d,但没有任何效果..
明确一点:我知道某些行包含错误数据,因此我不担心将它们排除在外。
【问题讨论】:
我鼓励您通过更改加载脚本将正确的数据类型加载到红移,以便轻松执行任何日期操作。此外,尝试 Pythonic 版本的 Redshift UDF 来解析这些条件。 Redshift UDF 方法创建了与 SQL 无关的解决方案,并且可以很好地扩展以支持开箱即用的多种日期格式。 @kadalamittai 感谢您的反馈,UDF 看起来很有前途,很快就会使用它们。 【参考方案1】:您遗漏了一个小细节:将所有 \d
s 更改为 \\d
。根据文档here:
Amazon Redshift 在正则表达式中支持以下受 Perl 影响的运算符。使用两个反斜杠 ('\') 转义运算符。
我尝试了以下方法:
create temp table v (starttime varchar(255));
insert into v values ('2000-08-21T23:10:37Z'), ('ddd');
-- the next line doesn't work, as you yourself suggested.
select CAST(starttime as timestamp) from v;
-- the next line works.
select case when starttime ~ '\\d1,4-\\d1,2-\\d1,2T\\d1,2:\\d1,2:\\d1,2Z' then cast(starttime as timestamp) else null end from v;
【讨论】:
有效,但希望存在类似于 try_convert 的东西。我想使用 UDF 函数也可以适应:***.com/questions/16948323/…(第二个答案)【参考方案2】:如果您从字符串中删除 T 并替换为可以转换的空格
CAST(replace(starttime, 'T', ' ') as timestamp)
【讨论】:
以上是关于Redshift (SQL):尝试转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL Server 2008 R2 中将 varchar 转换为时间戳