web-dev-qa-db-ja.com

Oracle SQL-DATEよりも大きい文

タイトルにあるように、クエリを介してSYSDATEから6か月が経過したデータセットを確認する方法を見つけたいと思います。

SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';

次のことを試しましたが、日付の形式が間違っているというエラーが返されます。ただし、データの挿入では、その日付形式を要求/意図どおりに使用しましたが、問題はありませんでした。

コマンドラインでのエラー:10列:25

ブロッククォート

エラーレポート -

SQLエラー:ORA-01861:リテラルはフォーマット文字列01861と一致しません。00000-「リテラルはフォーマット文字列と一致しません」

*原因:入力のリテラルは、フォーマット文字列のリテラルと同じ長さでなければなりません(先頭の空白を除く)。 「FX」修飾子がオンに切り替えられている場合、リテラルは余分な空白なしで正確に一致する必要があります。

*処置:リテラルに一致するようにフォーマット文字列を修正してください。

41
user3521826

クエリ文字列はリテラルであり、日付がDATEとして適切に格納されていると仮定すると、 date literals を使用する必要があります。

SELECT * FROM OrderArchive
WHERE OrderDate <= DATE '2015-12-31'

TO_DATE を使用する場合(たとえば、クエリ値がリテラルではないため)、US短縮形を使用しているときに NLS_DATE_LANGUAGE パラメーターを明示的に設定することをお勧めします月の名前。そうすれば、一部のローカライズされたOracleインストールで壊れることはありません。

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014', 'DD MON YYYY',
                           'NLS_DATE_LANGUAGE = American');
52
Sylvain Leroux

to_date()関数を使用して文字列を日付に変換する必要があります

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY');

OR

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014','DD MON YYYY');

OR

SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('2014-12-31','yyyy-MM-dd');

これは、OrderDateDate formatに保存されている場合にのみ機能します。 Varcharの場合は、その列にto_date() funcも適用する必要があります。

 SELECT * FROM OrderArchive
    WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd');
28
Sachu

to_Date()関数を使用して文字列を日付に変換する必要があります! http://www.techonthenet.com/Oracle/functions/to_date.php

1
kamokaze