跳过格式错误的日期解析 presto

Posted

技术标签:

【中文标题】跳过格式错误的日期解析 presto【英文标题】:Skip malformed date parsing presto 【发布时间】:2021-07-20 17:50:19 【问题描述】:

我正在使用以下查询来解析 presto 中的日期:

SELECT date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p') from table t

示例日期为:4/11/2021 12:30:00 PM

但有时我们得到的日期不是不能像 "testdate" 那样解析的(任何不是日期的字符串)

如何在查询中跳过此类日期?我的查询应该是这样的:

   select date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p') 
     from table t 
    where <skip the date that does not parse>

【问题讨论】:

【参考方案1】:

使用try()。 通常date_parse() 在错误的日期格式上失败。如果您添加try(),它将为错误的日期生成NULLs,您可以像这样过滤NULL记录:

select try(date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p'))
  from table t 
  --filter rows wich can not be parsed if necessary
 where try(date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p')) is not NULL

您也可以尝试使用 coalesce() 解析不同的格式以选择成功解析:

select
      coalesce( try(date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p')), --try format1
                try(date_parse(t.up_date, '%Y/%m/%d'))  --try format2
              )
 from table t 
where --filter only parsed dates
     coalesce( try(date_parse(t.up_date, '%c/%e/%Y %l:%i:%s %p')), --try format1
               try(date_parse(t.up_date, '%Y/%m/%d'))  --try format2
              ) is not NULL;

通过这种方式,您可以尝试解析数据中可能存在的不同格式。

【讨论】:

有时可以放置一个 where 子句来跳过它,但它不会有输出行。根据您的意图,这可能会或可能不会被接受。如果涉及多个表,也可以尝试将子句置于“ON”条件下进行连接。

以上是关于跳过格式错误的日期解析 presto的主要内容,如果未能解决你的问题,请参考以下文章

“反转”错误的解析日期

java 字符串转换成日期

如何解析 ISO 8601 格式的日期?

在字符串中解析和格式化日期

如何用批处理,根据日期并且跳过双休日,来批量命名Excel文件。如20131014这样的格式。每个

JSON 意外语法错误 - 日期解析/编码/解码