雅典娜日期格式无法将字符串转换为日期格式

vin*_*ham 2 date presto amazon-athena

尝试了以下语法,它们都没有帮助将字符串类型列转换为日期

select INVC_,APIDT,APDDT from APAPP100 limit 10
select current_date, APIDT,APDDT from APAPP100 limit 10
select date_format( b.APIDT, '%Y-%m-%d') from APAPP100 b
select CAST( b.APIDT AS date) from APAPP100 b
select date(b.APIDT) from APAPP100 b
select convert(datetime, b.APIDT) from APAPP100 b
select date_parse(b.APIDT, '%Y-%m-%d') from APAPP100 b
select str_to_date(b.APIDT) from APAPP100 b
Run Code Online (Sandbox Code Playgroud)

小智 11

这有效 -

cast(from_iso8601_timestamp(createdat) as date)
Run Code Online (Sandbox Code Playgroud)


jen*_*ter 7

将字符串解析为日期的正确查询将是date_parse.

这将导致以下查询:

select date_parse(b.APIDT, '%Y-%m-%d') from APAPP100 b
Run Code Online (Sandbox Code Playgroud)

prestodb docs: 6.10.日期和时间函数和运算符


Ale*_*gue 5

如果您需要转换其中具有单一日期格式的列,则@jens walter的答案很好。我遇到过这样的情况,即包含多个不同日期格式的列仍然很有用,并且仍然能够对其进行转换。

以下查询支持包含多种不同格式的日期的源列。

SELECT b.APIDT, 
   Coalesce(
     try(date_parse(b.APIDT, '%Y-%m-%d %H:%i:%s')),
     try(date_parse(b.APIDT, '%Y/%m/%d %H:%i:%s')),
     try(date_parse(b.APIDT, '%d %M %Y %H:%i:%s')),
     try(date_parse(b.APIDT, '%d/%m/%Y %H:%i:%s')),
     try(date_parse(b.APIDT, '%d-%m-%Y %H:%i:%s')),
     try(date_parse(b.APIDT, '%Y-%m-%d')),
     try(date_parse(b.APIDT, '%Y/%m/%d')),
     try(date_parse(b.APIDT, '%d %M %Y'))
   ) 
FROM APAPP100 b
Run Code Online (Sandbox Code Playgroud)

DATE_PARSE函数执行日期转换。

如果确实发生错误,则TRY函数通过返回NULL来处理错误。

COALESCE函数采用第一个非空值。

有一个更深入的写了这里(我的博客)。