2

「insert_date」列を持つテーブル X があります。この列は DATE 型であり、すべてのレコードに「17-JAN-13」という 1 つの値のみが含まれます。次のクエリは結果をまったく返さないと予想されます。

SELECT insert_date
FROM X
  WHERE ("X"."INSERT_DATE" IS NOT NULL
  AND NOT (("X"."INSERT_DATE" = to_date('2013-01-17', 'yyyy-mm-dd')
  )))

しかし、代わりに取得しているのは、多くの「17-JAN-13」レコードです。クエリの何が問題になっていますか?

4

2 に答える 2

8

OracleDATE列にも時刻が含まれています (その名前にもかかわらず)。既存の行の時刻は、 (関数00:00:00で作成した日付に「割り当てられた」) とは異なる可能性があります。to_date()

を使用して、列の時間部分を「削除」する必要がありますtrunc()

AND NOT (trunc(X.INSERT_DATE) = to_date('2013-01-17', 'yyyy-mm-dd'))

演算子<>の代わりに使用したいのですが:NOT

AND (trunc(X.INSERT_DATE) <> to_date('2013-01-17', 'yyyy-mm-dd'))

(ただし、それは単なる個人的な好みです。状態が読みやすくなると思います)。

したがって、完全なステートメントは次のようになります。

SELECT insert_date
FROM X
  WHERE trunc(X.INSERT_DATE) <> to_date('2013-01-17', 'yyyy-mm-dd')
于 2013-02-15T10:41:46.303 に答える
0

比較しながら時間部分を切り捨てるか、必要な部分のみを抽出することができますDD-MON-YYYY

SELECT insert_date FROM X 
WHERE X.INSERT_DATE IS NOT NULL and to_char(x.INSERT_DATE,'DD-MON-YYYY') <> '17-JAN-2013';
于 2013-02-22T12:18:00.467 に答える