2017-01-24 22 views
-1

私はUPDATE_DATEが等しい場合、ビューからすべてのフィールドを選択する必要がUPDATE_DATEwhere句

enter image description here

というフィールドを持つOracle DBのビューを持っています昨日の日付(現在の日付-1)である可能性があります。試しました

select * from ack where update_date = SYSDATE - 1 

ただし、データは返されません。私は昨日のDBの日付を見ます。

+0

列のデータ型? – jarlh

答えて

0

試してください:あなたが投稿何

select * from ack where trunc(update_date) = trunc(SYSDATE - 1) 

は日付が、彼らはおそらくように時間と分とで一部含まれて提示されている方法です。 truncは精度を日数にカットします。実行してください:

select to_char(update_date,'dd-mon-yyyy hh24:mi:ss') update_date, sysdate - 1 as curr_date from ack; 

あなたはこれらの値を比較しており、それらは同一ではありません。だからあなたは結果を得られないのです。

1

SYSDATEupdate_date列は時間コンポーネントを持っているので、あなたは、任意のデータが表示されない場合があります(すべてのDATETIMESTAMPデータ型がこれを持っている)が、使用しているIDEは、ちょうどあなたにそれを表示しないように選んでいます。 change this behaviour in SQL Developer see hereに。

これはupdate_date列にあなたが持っているすべてのインデックスを使用します。これはTRUNC(update_date)にファンクション索引を使用します

SELECT * 
FROM ack 
WHERE update_date >= TRUNC(SYSDATE) - INTERVAL '1' DAY 
AND update_date < TRUNC(SYSDATE); 

しかしupdate_date列にインデックスを使用しません。

SELECT * 
FROM ack 
WHERE TRUNC(update_date) = TRUNC(SYSDATE) - INTERVAL '1' DAY; 
-1

私は 'SYSDATE'より 'CURRENT_TIMESTAMP'が好きです - 両方とも同じことをすべきですが、読みやすさは長い道のりです。

'UPDATE_DATE'をDATEにキャストし(datetimeの場合)、CASTとDATEADDを使用して 'now'を 'yesterday'に調整することをおすすめします。

WHERE 
    CAST(update_date AS DATE) = CAST(DATEADD(day,-1,current_timestamp) AS DATE) 

EDIT:それはずさんなコードで、いくつかの機能の一部として使用される場合、予期しない結果をもたらすことができます(日付-1)を使用しないでください。

+0

Oracleでは、 'CURRENT_TIMESTAMP'、' CURRENT_DATE'、 'SYSTIMESTAMP'および' SYSDATE'は**同じではありません**。 'CURRENT_DATE'と' CURRENT_TIMESTAMP'は、*クライアント*の現在の日付と時刻を反映する日付/タイムスタンプ(それぞれ)のデータ型を返します(どちらも時間コンポーネントを持ち、タイムスタンプも秒単位です)。 'SYSDATE'と' SYSTIMESTAMP'は、*サーバー*の現在の日付/時刻を反映する日付/タイムスタンプ(それぞれ)データ型を返します(どちらも時間要素を持っています)。クライアントとサーバーが異なるタイムゾーンにある場合、2つの違いが表示されます。 – MT0

+0

'DATEADD()'は有効なOracle関数ではなく、 'DATETIME'データ型のようなものはありません。すべての「日付」には時間成分があります。 'SYSDATE - 1'はOracleで完全に有効なコードです - もしあなたが明示的にインターバルを定義したいなら' SYSDATE - INTERVAL '1' DAY'を使います。 – MT0

+0

私はその違いを理解していて、私の経験上、クライアントが異なる場合、クライアントは正しい値になります。それは私が 'DATEADD'で私を修正するためのものです - 私はADD_MONTHSを使用し、ADD_DAYSがないことを知っていましたが、 'DAY'の間隔を呼び出すことが重要だと思います。 –