presto SQL - 如果日期列格式与 yyyy-MM-dd 不匹配则过滤记录

presto SQL - Filter records if date column format is not matching yyyy-MM-dd

我需要从日期不符合格式 yyyy-MM-dd 的 table 中获取所有记录。

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

示例输入:

预期输出:

谢谢

使用regexp_like:

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

这将适用于“11-12-200”和 'None'。

如果您还想包含 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 并且不允许日期前后的其他字符 ( [=使用了 18=] 和 $ 锚)。

一个简单又强大的方法

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

where try_cast(start_date as date) is not null

这也会限制错误的日期,例如 Feb 30 (2000-02-30)