【问题标题】:presto SQL - Filter records if date column format is not matching yyyy-MM-ddpresto SQL - 如果日期列格式与 yyyy-MM-dd 不匹配,则过滤记录
【发布时间】:2021-05-05 10:50:52
【问题描述】:

我需要从日期与格式 yyyy-MM-dd 不匹配的表中获取所有记录。

这里,列 ID 是唯一的 bigint 列。 start_date 是 varchar 数据类型。

示例输入:

预期输出:

谢谢

【问题讨论】:

    标签: date presto trino presto-jdbc


    【解决方案1】:

    使用 regexp_like:

    select id, start_date
      from mytable
     where NOT regexp_like(start_date, '\d{4}-\d{2}-\d{2}')
    

    这适用于“11-12-200”和“无”。

    如果您还想包含 NULL 值,请添加附加条件:

     where (NOT regexp_like(start_date, '\d{4}-\d{2}-\d{2}'))
        OR start_date is null
    

    更严格的日期正则表达式是'^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$'

    这将限制月份为01 .. 12 和日期为01 .. 31 并且不允许在日期之前和之后的其他字符(使用^$ 锚点)。

    一种更简单、更强大的方法

    是使用try_cast(col as date) - 如果无法转换,它将返回 NULL:

    where try_cast(start_date as date) is not null
    

    这也将限制错误日期,例如 2 月 30 日 (2000-02-30)

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2018-03-07
      • 2015-06-11
      • 2014-05-05
      • 1970-01-01
      • 2021-11-25
      • 2016-01-02
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多