web-dev-qa-db-ja.com

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

文字列を日付に解析するための正しいクエリはdate_parse

これにより、次のクエリが実行されます。

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

prestodb docs: 6.10。日付と時刻の関数と演算子

9
jens walter

これはうまくいった-

cast(from_iso8601_timestamp(createdat) as date)
6
Sagar Patil

@jensウォルターの答えは、単一の日付形式の列を変換する必要がある場合に最適です。複数の異なる日付形式を含む列があり、それを変換できると便利な状況がありました。

次のクエリは、複数の異なる形式の日付を含むソース列をサポートしています。

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関数は最初の非null値を取ります。

より詳細な記述 ここ (私のブログ)があります。

6
Alex Hague
_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}')