暂无图片
求一个能判断YYYY-MM-DD HH24:MI:SS正则表达式
我来答
分享
dnxqw2019
2022-10-11
求一个能判断YYYY-MM-DD HH24:MI:SS正则表达式
暂无图片 5M
 select case
            when regexp_like('2999-11-30',
                             '^((((19|2\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((19|2\d)\d{2})-(0?[469]|11)-(0?[1-9]|[12]\d|30))|(((19|2\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((19([02468][048]|13579)[26]|2\d(0[48]|[13579][26]|[2468][048])|(2000))-0?2-(0?[1-9]|[12]\d)))$') then
             1
            else
             0
          end
     from dual;

如上,求大神给一个能判断YYYY-MM-DD HH24:MI:SS 格式的正则表达式。

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
DarkAthena

date类型都是统一根据nls变量或者工具设置的格式来显示的,
如果显示成YYYY-MM-DD,则表示时分秒部分为00:00:00,工具自动省略了显示,并不是说这个值里就没有时分秒。
如果想要过滤掉不含时分秒的数据,直接用下面这个条件就行了,没必要用正则

trunc(字段)<>字段
暂无图片 评论
暂无图片 有用 1
暂无图片
dnxqw2019
题主
2022-10-12
这个核收时间有的是全日期YYYY-MM-DD HH24:MI:SS,有的是YYYY-MM-DD。 不是全都是YYYY-MM-DD。不过这个方法确实解决了问题,感谢。
Thomas

^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[-]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$

如果年份只能是19XX或20XX的话,用这个

暂无图片 评论
暂无图片 有用 0
李宏达

试试这个

select case when regexp_like('20191111','^((((1|2|3)\d{3})(0[13578]|1[02])(0[1-9]|[12]\d|3[01]))|(((1|2|3)\d{3})(0[469]|11)(0[1-9]|[12]\d|30))|(((1|2|3)\d{3})02(0[1-9]|1\d|2[0-8]))|((((1|2|3)/d([13579][26]|[2468][048]|0[48]))|(1000)|(2000)|(3000))02(0[1-9]|[12]\d)))$') then 1 else 0 end from dual; (((1|2|3)\d{3})(0[13578]|1[02])(0[1-9]|[12]\d|3[01])) 1000年到3999年的1,3,5,7,8,10,12月,即到31号的月份 (((1|2|3)\d{3})(0[469]|11)(0[1-9]|[12]\d|30)) 1000年到3999年的4,6,9,11月,即到30号的月份 (((1|2|3)\d{3})02(0[1-9]|1\d|2[0-8])) 1000年到3999年的2月,所有的2月都到28号 ((((1|2|3)/d([13579][26]|[2468][048]|0[48]))|(1000)|(2000)|(3000))02(0[1-9]|[12]\d)) 1000年到3999年中的闰年,2月有29号
暂无图片 评论
暂无图片 有用 0
Thomas

刚才表达式有误,用这个

select case
when regexp_like('1974-01-30 04:24:48',
'^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$') then
1
else
0
end
from dual;




select case
when regexp_like('1974-01-30 25:24:48',
'^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$') then
1
else
0
end
from dual;



select case
when regexp_like('1974-01-30 23:24:68',
'^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$') then
1
else
0
end
from dual;

暂无图片 评论
暂无图片 有用 0
dnxqw2019
题主
2022-10-11
SELECT 核收时间,审核时间 FROM 检验标本记录 where id = 14324310 and REGEXP_LIKE(to_char(核收时间,'yyyy-mm-dd hh24:mi:ss'), '^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$')
dnxqw2019

微信图片_20221011165949.png

如图,我想过滤掉YYYY-MM-DD这种不是全日期的格式,用您给的这个表达式实现不了呢,这个判断列是动态的。

暂无图片 评论
暂无图片 有用 0
Thomas


这里字段d是日期类型,你的核收日期也应该是日期类型

SQL> select * from tbtb;

D
-------------------
2022-04-02 00:00:00
2022-04-01 12:56:04

再加个条件

select * from tbtb where regexp_like(to_char(d,'yyyy-mm-dd hh24:mi:ss'),
'^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ]([01][0-9]|2[0123])[:]([0-5][0-9])[:]([0-5][0-9])$') and
not regexp_like(to_char(d,'yyyy-mm-dd hh24:mi:ss'),'^(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])[ ](00:00:00)$');
D
-------------------
2022-04-01 12:56:04

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏