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)
我需要从日期不符合格式 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)