Athena日期格式无法将字符串转换为日期格式。

15

我尝试了下面的语法,但都无法将一个字符串类型的列转换为日期

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

1
APIDT(1995-09-27)是字符串类型。 - vinsent paramanantham
4个回答

22

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

这将导致以下查询:

select date_parse(b.APIDT, '%Y-%m-%d') from APAPP100 b

PrestoDB文档:6.10. 日期和时间函数与运算符


1
尝试执行上述选择时出现以下错误:INVALID_FUNCTION_ARGUMENT: Invalid format: "12633 " is malformed at "3 " - vinsent paramanantham
1
这看起来像是一个无效的日期格式。因此,我宁愿查看输入数据而不是转换该数据。"12633" 不符合任何日期模式。 - jens walter
1
APIDT 1995-09-27(这在表中是字符串类型)我无法为该列指定日期格式和时间戳格式。当我尝试将该列指定为日期时,我遇到了以下错误: “FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.UnsupportedOperationException: Parquet does not support date. See HIVE-6384” - vinsent paramanantham

19

如果您需要将包含单个日期格式的列转换,请参考@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

DATE_PARSE函数用于日期转换。

TRY函数通过返回NULL来处理错误(如果发生错误)。

COALESCE函数取第一个非空值。

这里有一篇更详细的文章(我的博客)


14

这个有效 -

cast(from_iso8601_timestamp(createdat) as date)

你,先生,是一个英雄。 - BuffMcBigHuge

1
SELECT   b.APIDT,
         b.Appppppppp,
         date_diff('day',current_date, date(b.APIDT)) AS Duedays
FROM xyz100 a
WHERE regexp_like(b.apidt, '[0-9]{4}-[0-9]{2}-[0-9]{2}')

WHERE NOT regexp_like(b.apidt, '[0-9]{4}-[0-9]{2}-[0-9]{2}')用于排除垃圾日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接