2016-04-26 122 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)。

祝你好運!