タイトルにあるように、クエリを使ってSYSDATEから6ヶ月を過ぎたデータセットを確認する方法を探しています。
SELECT * FROM OrderArchive
WHERE OrderDate <= '31 Dec 2014';
以下の方法を試してみましたが、日付形式が間違っているというエラーが返ってきます。しかし、データを挿入する際には、要求/意図された通りにその日付形式を使用し、問題はありませんでした。
コマンドラインでのエラー : 10 カラム : 25
ブロッククオート
エラーレポート
SQLエラーです。ORA-01861: リテラルがフォーマット文字列と一致しない 01861.00000 - "リテラルがフォーマット文字列と一致しません"
*原因です。 入力のリテラルは、フォーマット文字列のリテラルと同じ長さでなければなりません。 原因:入力のリテラルは、フォーマット文字列のリテラルと同じ長さでなければなりません(先頭のホワイトスペースを除く)。 入力された FX"モディファイアがオンになっている場合、リテラルは正確に一致しなければなりません。 と正確に一致しなければなりません(余分なホワイトスペースは含まれません)。
*Action: リテラルと一致するようにフォーマット文字列を修正します。
クエリ文字列はリテラルであり、日付が DATE
として適切に保存されていると仮定すると、日付リテラル を使用する必要があります。
SELECT * FROM OrderArchive
WHERE OrderDate <= DATE '2015-12-31'
もしTO_DATE`を使用したい場合(例えば、クエリ値がリテラルではない場合)は、米国の略式月名を使用しているので、NLS_DATE_LANGUAGEパラメータを明示的に設定することをお勧めします。そうすれば、ローカライズされたOracle Installationでも動作しなくなります。
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014', 'DD MON YYYY',
'NLS_DATE_LANGUAGE = American');
文字列を日付に変換するには、to_date()
関数を使います。
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31-Dec-2014','DD-MON-YYYY');
または
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('31 Dec 2014','DD MON YYYY');
または
SELECT * FROM OrderArchive
WHERE OrderDate <= to_date('2014-12-31','yyyy-MM-dd');
これは OrderDate
が Date 形式
で格納されている場合にのみ動作します。もしVarchar
であれば、以下のようにto_date()
ファンクをそのカラムにも適用する必要があります。
SELECT * FROM OrderArchive
WHERE to_date(OrderDate,'yyyy-Mm-dd') <= to_date('2014-12-31','yyyy-MM-dd');