暂无图片
求一个能判断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
打赏 0
暂无图片
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
打赏 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
打赏 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
打赏 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
打赏 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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
以下sql怎么消除排序?
回答 2
这个确实消除不了,按两个表的字段排序,索引只能按自己的排
sql数据库查询数据量太大查不出来
回答 3
已采纳
使用explian查看下执行计划,根据extra列进行优化可以看看之前墨天轮大神留的文档:https://www.modb.pro/db/47381
有没有办法做出如下图的行列转换?
回答 1
已采纳
(/ω\)你这是列名都要转进去?直接把数据导出到excel,然后用excel的TRANSPOSE函数转吧
硬盘问题导致集群执行效率变慢
回答 2
有报告吗?你判断因为磁盘导致有什么依据呢
求教第二行的入院时间减去第一行的出院时间SQL怎样写?
回答 4
已采纳
楼上采纳的那个有点问题,这个表里肯定不止一个人,所以开窗函数里要加上“partitionby姓名”,而且也不需要用&quot;ROWSBETWEENCURRENTROWAND1FOLLOWING&qu
SQL 数据库初始化密码怎么设置密码等级?
回答 1
已采纳
具体看那种数据库,以mysql为例,可以通过参数validatepasswordpolicy设定密码强度校验,以及通过参数validatepasswordlength设定密码长度校验。
为什么学了SQL还要学ETL呢?
回答 2
已采纳
这两者根本就不能放在一起比较,因为这两者是描述的不同的东西。ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程结构化查询语言(StructuredQueryLanguage)简称SQL
求一SQL
回答 4
已采纳
withcteas(select1asid,100astotalfromdualunionallselect1asid,100astotalfromdualunionallselect2asid,10
truncate和delete区别 ?
回答 3
已采纳
Truncate和delete都可以将数据实体删掉,truncate的操作并不记录到rollback日志,所以操作速度较快,但同时这个数据不能恢复Delete操作不腾出表空间的空间Truncate不能
oracle做了spa后,提示有10多条sql性能下降,具体看执行计划,发现新老执行计划是一模一样的,只是执行时间变慢了,即使是执行计划变化报告里面,具体看执行计划也是没变。这种情况下,感觉spa就没什么价值了?
回答 1
你的统计信息一样吗?