0
SELECT LISTING_EOD.LOCATION, LISTING_EOD.APPTTIME, LISTING_EOD.PERSON_ID,
    LISTING_EOD.FORENAME, LISTING_EOD.SURNAME, LISTING_EODS.STATUS,
    LISTING_EOD.DBDATE
FROM DBNAME.LISTING_EOD LISTING_EOD; 

このクエリは、今日処理されたデータのリストを返します。昨日のデータを確認するために変更する必要があります。以下のコード行を追加しようとしましたが、何も返されません。どうすればこれを達成できるか知っている人はいますか?

where LISTING_EOD.DBDATE = '18-OCT-2012';
4

3 に答える 3

2

使用できる日付をハードコーディングするのではなく、常に昨日のデータが必要な場合:

WHERE LISTING_EOD.DBDATE >= TRUNC(SYSDATE) - 1
AND LISTING_EOD.DBDATE < TRUNC(SYSDATE)

TRUNC(SYSDATE)今朝の真夜中を返すので、今日実行すると ~ の範囲に18-Oct-2010 00:00:00なり18-Oct-2012 23:59:59ます。

一般に、暗黙の日付形式マスクを使用することはお勧めできません。NLS_DATE_FORMAT元のコードはが に設定されていると想定していますがDD-MON-YYYY、現在は正しくない可能性があり (既存の選択で時間が表示されている場合は、おそらくそうではありません)、将来的にはそうではない可能性があります。TO_DATE('18-OCT-2012', 'DD-MON-YYY')あいまいさや予期しない動作を避けるために、常に明示的な日付形式マスク ( など) を使用してください。


フィールドが実際にはaVARCHAR2ではなくDATE(これは悪いことです)、日付範囲を文字列に変換して一致させる必要があります。

WHERE LISTING_EOD.DBDATE >= TO_CHAR(TRUNC(SYSDATE) - INTERVAL '1' DAY, 'DD-MON-YYYY HH24:MI:SS')
AND LISTING_EOD.DBDATE <= TO_CHAR(TRUNC(SYSDATE) - INTERVAL '1' SECOND, 'DD-MON-YYYY HH24:MI:SS')

これは 1 日だけで機能しますが、日付範囲を探すのに問題があります。適切な型の列にデータを格納する方がはるかに安全です。

于 2012-10-19T09:05:12.243 に答える
0

照会していた「テーブル」がビューであることに気付き、sqldeveloper内で調べ、sysdateに「-1」を追加しました。このクエリは、前日の結果を返しました。

受け取ったすべての助けに感謝して、私は正しいデータを正常に取得しました。

于 2012-10-19T09:39:26.627 に答える
0

Oracle の日付にはデフォルトで時刻も含まれています。'18-OCT-2012' のみを指定すると、18-OCT-2012 00:00:00' のみに一致します。これを回避する 1 つの方法は、データベースの日付を比較対象の日付にフォーマットすることです。この比較では、時間が完全に無視されます。

文字列の代わりに比較する日付変数がある場合は、データベースの日付に使用されるのと同じ日付マスクを使用してこれをフォーマットします。これにより、問題のデータベースのデフォルトの日付形式に関する仮定も回避されます。

于 2012-10-19T09:35:03.740 に答える