2016-04-26 204 views
2

我有表数据:甲骨文,REGEXP_LIKE

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。我是新的正则表达式,并且这个字符串像[]] [] /。总是让我烦恼。

+1

什么标准'like'条款:'这里your_column如'%04-25%'?否则,请参阅http://stackoverflow.com/a/22944075/1225328快速介绍正则表达式。 – sp00m

+0

日期列是真的'varchar'还是'date'就像你给出的一样显示。 – Utsav

+0

以这种格式... 25/14 ...它必须是varchar –

回答

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\/');  

这是假定了很多有关的日期/时间列是店d在varchar2中(可以说是一个坏主意)。它始终是这种格式,它不是NULL,分隔符总是一个斜线,如果输入来自一个屏幕形式的验证和清理,以确保它匹配这种格式,等等。你可能想要搜索的日期/时间列意想不到的格式,以确保你真的知道你在处理什么。由于它是一个varchar2,你真的不能确定(存储在该数据类型中的日期问题之一)。

我强烈建议您将此日期/时间存储在适当的日期列中,并且如果您拥有该权限,则可以节省一些麻烦。

编辑:你可以拧紧它通过使用此REGEXP_SUBSTR比较。正则表达式使它匹配整条线,特别将所捕获的每月/每天的组与您想要的匹配。如果未找到模式,则返回NULL,这样处理是通过用NVL周围是reurns“VALUE NOT FOUND”或什么是合适的,也许:

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

SYSDATE支持这种格式(2016-04-25/14:15:18)? Mayby SYSTIMESTAMP? –

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)。

祝你好运!