我需要从日期与格式 yyyy-MM-dd 不匹配的表中获取所有记录。
在这里,列 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”和“无”。
如果您还想包含 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)