我有数据表:
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的新手,这个字符串像[]] [] /。总是让我恼火。
答案 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';