【问题标题】:Athena date format unable to convert string to date formateAthena 日期格式无法将字符串转换为日期格式
【发布时间】:2018-02-23 06:51:10
【问题描述】:

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

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

【问题讨论】:

  • APIDT (1995-09-27 ) 它的字符串类型

标签: date presto amazon-athena


【解决方案1】:

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

这将导致以下查询:

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

prestodb 文档: 6.10. Date and Time Functions and Operators

【讨论】:

  • 尝试执行上述选择时出现以下错误选择INVALID_FUNCTION_ARGUMENT: Invalid format: "12633 " is malformed at "3 "
  • 这看起来像是一个无效的日期格式。所以 。我宁愿查看输入数据,而不是该数据的转换。 “12633”是任何模式,不是日期。
  • 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
【解决方案2】:
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}') 排除垃圾日期

【讨论】:

    【解决方案3】:

    如果您需要转换具有单一日期格式的列,@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 函数采用第一个非空值。

    有更深入的文章here(我的博客)。

    【讨论】:

      【解决方案4】:

      这行得通 -

      cast(from_iso8601_timestamp(createdat) as date)
      

      【讨论】:

      • 你先生,是个英雄。
      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 2018-08-30
      • 2014-01-18
      相关资源
      最近更新 更多