SQL查询字符串日期字段中不符合yyyy/mm/dd格式的错误数据行
筛选字符串日期字段不符合yyyy/mm/dd规范的SQL方案
核心判断逻辑
场景中不规范数据主要分两类:一类是错误录成mm/dd/yyyy格式的日期,一类是其他乱填的非日期脏数据,判断时要覆盖两类场景,规则如下:
- 首先校验长度:标准
yyyy/mm/dd格式固定长度为10位,长度不对的直接判定为不规范 - 校验斜杠位置:标准格式第一个
/在第5位、第二个/在第8位;而错误的mm/dd/yyyy格式斜杠在第3、6位,这一步可以直接把所有格式录反的错误数据筛出来 - 最后校验日期合法性:拆分出的年、月、日必须是合法数字,且符合日期取值规则(比如月份不能大于12、日期不能超过当月最大天数),避免漏判乱填的脏数据
不同数据库的实现代码
MySQL
-- 替换表名、字段名为实际业务中的名称即可 SELECT * FROM 你的表名 WHERE CHAR_LENGTH(日期字符串字段) != 10 OR SUBSTRING(日期字符串字段, 5, 1) != '/' OR SUBSTRING(日期字符串字段, 8, 1) != '/' OR STR_TO_DATE(日期字符串字段, '%Y/%m/%d') IS NULL;
PostgreSQL
SELECT * FROM 你的表名 WHERE CHAR_LENGTH(日期字符串字段) != 10 OR SUBSTRING(日期字符串字段, 5, 1) != '/' OR SUBSTRING(日期字符串字段, 8, 1) != '/' OR TO_DATE(日期字符串字段, 'YYYY/MM/DD') IS NULL;
SQL Server
SELECT * FROM 你的表名 WHERE LEN(日期字符串字段) != 10 OR SUBSTRING(日期字符串字段, 5, 1) != '/' OR SUBSTRING(日期字符串字段, 8, 1) != '/' OR TRY_CONVERT(DATE, 日期字符串字段, 111) IS NULL;
优化提示
如果业务对日期范围有明确要求,可以额外增加年份区间判断,比如要求年份在1990-2100之间,在WHERE条件中补充对应年份段的范围校验即可,能进一步规避极端边界值的误判。
内容的提问来源于stack exchange,提问作者Andy Reagan
相关产品推荐
相关产品推荐

