2016-05-31 13 views
0

クエリのdatetime列がnullでなくNULL値を必要とします。 しかし、私は今クエリがnull値を持っていません。私は両方の値を照会したい。Oracle:datetime列がNULLでなくヌル値の場合のクエリ方法

問合せ:

select l.com_code, 
     l.p_code, 
     to_char(l.effdate,'dd/mm/yyyy') effdate,to_char(l.expdate,'dd/mm/yyyy') expdate 
from RATE_BILL l 
where (to_date('02/06/2016','dd/mm/yyyy') <= to_date(l.effdate,'dd/mm/yyyy') 
    or to_date('02/06/2016','dd/mm/yyyy') <= to_date(l.expdate,'dd/mm/yyyy')) 

データサンプル

com_code | p_code | effdate | expdate 
A  | TEST01 | 01/01/2016 | 31/05/2016 
A  | Test01 | 01/06/2016 | 

クエリ結果:

com_code | p_code | effdate | expdate 
A  | TEST01 | 01/01/2016 | 31/05/2016 
A  | Test01 | 01/06/2016 | 

カラムEXPDATE nullの場合= '31/9998' 分の12はDBでのショーがnullの とき、クエリ日時= '02// 2016' 06をもたらすはずの間にあるこの

com_code | p_code | effdate | expdate  
A  | Test01 | 01/06/2016 | 

しかし、ここでクエリは

where (to_date('31/05/2016','dd/mm/yyyy') <= to_date(l.effdate,'dd/mm/yyyy') or to_date('31/05/2016','dd/mm/yyyy') <= to_date(l.expdate,'dd/mm/yyyy')) 

なるはずである

A  | TEST01 | 01/01/2016 | 31/05/2016 
A  | Test01 | 01/06/2016 | 
です

値日時は「Now Datetime」

+0

をeffdate'が、その後 'TO_DATE(l.effdateを使用して' DATE'列、ある '場合は、「/ DD mm/yyyy ') 'が間違っています。 'date'値を' date'に変換するために、 'date'カラムの' to_date() 'をコールしないで*** ***しないでください。 –

答えて

0

まず、あなたの言葉の意味を[犯罪意図なし]から理解できないことを私は認めなければなりません。この回答があなたのニーズに対応していない場合は、お気軽にコメントしてください。

クエリのwhere条件は、テーブル/ビューの列とそのSQLデータ型に基づいて作成されます。 datetime列をdatetimeデータ型に変換する必要はありません。

それは暗黙的な変換を意味ので、それはここに潜在的に有害である:とここで条件を補完する、NULL値に対応するために

where to_date('02/06/2016','dd/mm/yyyy') <= l.effdate 
    or to_date('02/06/2016','dd/mm/yyyy') <= l.expdate 

:だからにWHERE条件を変更

date column 
    -> char /* implicit, default format */ 
     -> date /* express format; 
        in general will differ from the format the argument 
        string follows 
       */ 

を'十分に大きい'日時で、db列のNULL値の場合と比較する:

where to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.effdate, to_date('12/31/9998','dd/mm/yyyy')) 
    or to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.expdate, to_date('12/31/9998','dd/mm/yyyy')) 

自由に別のカットオフ日付を使用することができます。たとえば、あなたがそれ以外の場合はnullでないときrate_billからexpdateを使用すると、現在の日時があります

where to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.effdate, to_date('12/31/9998','dd/mm/yyyy')) 
    or to_date('02/06/2016','dd/mm/yyyy') <= nvl(l.expdate, sysdate) 
+0

ありがとうございました。それは仕事だ; D – nettoon493

0

問題の詳細はわかりませんが、null値の比較に問題があると思います。

ヌル値は比較によって無視されます。これらの列を選択するには、明示的にチェックする必要があります。l.effdate is null

-- select with expdate < today or with no expdate 
select * 
from RATE_BILL l 
where l.expdate is null or 
l.expdate <= trunc(sysdate) 
関連する問題