我的需求是 判断 date = yyyy-MM-dd,date代表的是时间字段        

        最近是有实践到一些数据治理的工作,其中有个校验时间相关字段是不是符合日期规范的需求,由于前同事已经写过一版这个需求的数据质量规则sql了,所以我一开始只是打算引用一下,但是sql跑完我发现没有合格的数据,以下是前同事的原sql模型:

select 
*
from ${tableName}
where regexp_like(date,'^\\d{4}(\\-|\\/|\\.)\\d{1,2}\\1\\d{1,2}$')

    

        其中regexp_like函数的 参数1 date 可以根据自己的场景换成 '2022-07-07'、'2022-07-07'、'20220707',参数2 '^\\d{4}(\\-|\\/|\\.)\\d{1,2}\\1\\d{1,2}$' 也可以根据自己的场景进行替换。但是我百度了一些相关的正则文章后发现前同事写的这个不太满足我的场景(我并不了解之前的需求,也没有文档交接,很古老的东西了),ps:我用的是impala做查询,各位也要注意数据库的不同会导致语法和函数的写法可能不太一样

像咱们平常用到的时间字段格式一般都是 '2022-07-07 01:01:01'、'2022/07/07 01:01:01'、'20220707 01:01:01',也会有一些其他场景,如: 年月'2022-07'、'2022/07'、'2022-7',年月日'2022-7-7'等等。
后来我自己拼接了一下,成功实现了我需要的场景,代码如下:
select 
*
from ${tableName}
where regexp_like(substr(date,1,10),'^\\d{4}(-)\\d{1,2}(-)\\d{1,2}$')
参数1 substr(date,1,10) 作用是截取时间('2022-07-07 01:01:01') 的前面10个字符串('2022-07-07'),如果自身场景中时间字段不带时分秒的可以不用截取
参数2 '^\\d{4}(-)\\d{1,2}(-)\\d{1,2}$' 正则对于我这种小白可能不太友好,我就多写一点
①首先是单引号内的第一个符号, ^ 代表的是所输入的字符串开始的位置(在网上也看到说这个符合如果加在方括号内代表的意思是不匹配括号内表达式的集合)
②\\d{4}代表的是匹配4位数字,(-)代表的是连接符号为 - ,\\d{1,2}代表的是匹配一个到两个数字,因为月份或者日期中有些场景不同的可能会没有使用 0 去填充成 07 这样,$代表的是匹配结尾的字符串。
那么在不同的场景下我们就可以根据自己的需求去改变连接符号 (-) 或者去除连接符号

以上就是简单的数据治理日期格式符合yyyy-MM-dd的校验方式了,写的不好的地方大家多多见谅

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐