Oracle,REGEXP_LIKE

时间:2016-04-26 09:55:37

标签: regex oracle

我有数据表:

43  SQL Developer   2016-04-25/14:15:18
43  SQL Developer   2016-04-25/14:11:41
43  SQL Developer   2016-04-26/11:11:11

我想只显示日期为25.04的行。我是regexp的新手,这个字符串像[]] [] /。总是让我恼火。

2 个答案:

答案 0 :(得分:1)

如果要与日期(真正采用日期时间格式的值)进行比较,请确定它是数据库中的表中的值,运行时传入的绑定变量还是任何其他类型的真正“日期时间” “tipe,你可以像这样比较:

... where to_date(substr(your_col, 1, instr(your_col, '/')-1), 'yyyy-mm-dd') = date_param

此处your_col是您在问题中说明的列的名称(保留那些“看起来像”日期/时间的字符串),而date_param是您要与之比较的日期。

注意 - 如果date_param可能有一个TIME组件(00:00:00除外),则需要在右侧有trunc(date_param)。在左侧,您不需要trunc(),因为to_date使用我显示的方式已经为您提供了“截断”数据(默认情况下时间设置为00:00:00)。

祝你好运!

答案 1 :(得分:1)

我的第一个倾向是做日期操作,但由于问题是根据REGEXP_LIKE提出的,我假设OP想要使用字符串操作:

将第3列转换为日期,然后提取月份= 4和日期= 25的位置:

with tbl(col1, col2, col3) as (
  select 43, 'SQL Developer', to_date('2016-04-25/14:15:18', 'YYYY-MM-DD/HH24:MI:SS') from dual union
  select 43, 'SQL Developer', to_date('2016-04-25/14:11:41', 'YYYY-MM-DD/HH24:MI:SS') from dual union
  select 43, 'SQL Developer', to_date('2016-04-26/11:11:11', 'YYYY-MM-DD/HH24:MI:SS') from dual
)
select col1, 
       col2,
       col3
from tbl
where EXTRACT(month FROM col3 ) = 4
and EXTRACT(day FROM col3 ) = 25; 

使用REGEXP_LIKE:

with tbl(col1, col2, col3) as (
  select 43, 'SQL Developer', '2016-04-25/14:15:18' from dual union
  select 43, 'SQL Developer', '2016-04-25/14:11:41' from dual union
  select 43, 'SQL Developer', '2016-04-26/11:11:11' from dual
)
select col1, 
       col2,
       col3
from tbl
where regexp_like(col3, '04-25\/');    

这假定了很多关于存储在varchar2中的日期/时间列(可以说是一个坏主意)。它始终采用这种格式,它不是NULL,分隔符总是斜杠,如果输入来自屏幕表单,经过验证并擦除以确保它与此格式匹配等。您可能希望在日期/时间列上搜索意外格式,以确保您真正了解您正在处理的内容。由于它是一个varchar2,你真的不能确定(日期存储在该数据类型中的一个问题)。

我强烈建议您将此日期/时间存储在正确的日期列中,如果您拥有该权限,可以省去一些麻烦。

编辑:您也可以使用此REGEXP_SUBSTR进行比较来加强它。正则表达式使其匹配整行,特别是将捕获的月/日组与您想要的匹配。如果找不到模式,则返回NULL,因此通过用一个NVL重新包含“未找到的值”来处理它。或者任何合适的东西:

where regexp_substr(col3, '^\d{4}-(\d{2}-\d{2})\/\d{2}:\d{2}:\d{2}$', 1,1,null,1) = '04-25';