2

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

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

样本输入:

在此处输入图像描述

预期输出:

在此处输入图像描述

谢谢

4

1 回答 1

0

使用 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)

于 2021-02-01T10:36:48.587 回答