私はUPDATE_DATEが等しい場合、ビューからすべてのフィールドを選択する必要がUPDATE_DATEwhere句
というフィールドを持つOracle DBのビューを持っています昨日の日付(現在の日付-1)である可能性があります。試しました
select * from ack where update_date = SYSDATE - 1
ただし、データは返されません。私は昨日のDBの日付を見ます。
私はUPDATE_DATEが等しい場合、ビューからすべてのフィールドを選択する必要がUPDATE_DATEwhere句
というフィールドを持つOracle DBのビューを持っています昨日の日付(現在の日付-1)である可能性があります。試しました
select * from ack where update_date = SYSDATE - 1
ただし、データは返されません。私は昨日のDBの日付を見ます。
試してください:あなたが投稿何
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;
あなたはこれらの値を比較しており、それらは同一ではありません。だからあなたは結果を得られないのです。
SYSDATE
とupdate_date
列は時間コンポーネントを持っているので、あなたは、任意のデータが表示されない場合があります(すべてのDATE
とTIMESTAMP
データ型がこれを持っている)が、使用している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;
私は '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)を使用しないでください。
Oracleでは、 'CURRENT_TIMESTAMP'、' CURRENT_DATE'、 'SYSTIMESTAMP'および' SYSDATE'は**同じではありません**。 'CURRENT_DATE'と' CURRENT_TIMESTAMP'は、*クライアント*の現在の日付と時刻を反映する日付/タイムスタンプ(それぞれ)のデータ型を返します(どちらも時間コンポーネントを持ち、タイムスタンプも秒単位です)。 'SYSDATE'と' SYSTIMESTAMP'は、*サーバー*の現在の日付/時刻を反映する日付/タイムスタンプ(それぞれ)データ型を返します(どちらも時間要素を持っています)。クライアントとサーバーが異なるタイムゾーンにある場合、2つの違いが表示されます。 – MT0
'DATEADD()'は有効なOracle関数ではなく、 'DATETIME'データ型のようなものはありません。すべての「日付」には時間成分があります。 'SYSDATE - 1'はOracleで完全に有効なコードです - もしあなたが明示的にインターバルを定義したいなら' SYSDATE - INTERVAL '1' DAY'を使います。 – MT0
私はその違いを理解していて、私の経験上、クライアントが異なる場合、クライアントは正しい値になります。それは私が 'DATEADD'で私を修正するためのものです - 私はADD_MONTHSを使用し、ADD_DAYSがないことを知っていましたが、 'DAY'の間隔を呼び出すことが重要だと思います。 –
列のデータ型? – jarlh