2016-04-26 21 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である行だけを表示したいです。私はregexpで新しく、この文字列は[]] [] /のようになります。いつも私を怒らせた。

+1

何標準 'like'句について:' your_column '%04-25%'のように?そうでなければ、regexesの簡単な紹介についてはhttp://stackoverflow.com/a/22944075/1225328を参照してください。 – sp00m

+0

日付列は本当に 'varchar'か、あなたが与えたように' date'が表示されていますか? – Utsav

+0

この形式で... 25/14 ...それはvarcharでなければなりません。 –

答えて

1

私の最初の傾斜は、日付操作を行うことでしたが、質問はREGEXP_LIKEの観点から頼まれたので、私はOPは、文字列操作を使用したいと仮定します:その後、場所を抽出する、これまでに3列の変換

を月= 4日= 25:REGEXP_LIKEを使用して

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; 

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なので、確かに確信が持てません(日付の問題の1つがそのデータ型に格納されています)。

この日付/時刻を適切な日付の列に保存することをお勧めします。権限を持っている場合は、手間を省いてください。

編集:このREGEXP_SUBSTRを使用して比較することもできます。正規表現は、行全体と一致させ、特にキャプチャした月/日のグループをあなたが望むものと一致させます。パターンが見つからない場合は、NULLはNVLとそれを囲むことによってreurns「VALUEが見つからない」または何が多分適切であるとことを扱えるように返されます。

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に設定されています)。

幸運を祈る!