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】:

您遗漏了一个小细节:将所有 \ds 更改为 \\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):尝试转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

将 int 转换为时间戳或任何日期格式 sql

将文本列转换为时间戳

在 SQL Server 2008 R2 中将 varchar 转换为时间戳

在 Hive 中将 Long 转换为时间戳

SQL Anywhere 错误 -157:无法将“08/10/09”转换为时间戳

Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?