0

以下のようなEMP_DATE列を持つテーブル構造があります

 ID       EMP_DATE
----    -----------
5400     14-FEB-2012

そして私は以下のようにテーブルにレコードを挿入しました

INSERT INTO TEST_DATE VALUES(5400,SYSDATE);

行が選択されていないものEMP_DATE としてレコードをフェッチしようとしているときにレコードを挿入した後。SYSDATEとりあえずSYSDATE'01-JUL-2012`

 SELECT * FROM TEST_DATE WHERE EMP_DATE = SYSDATE;
                (OR)
 SELECT * FROM TESt_DATE WHERE EMP_DATE = '01-JUL-2012';

私は解決策を見つけることができませんでした。どんな提案も役に立ちます。

4

1 に答える 1

5

主な問題は、日付に時間、分、秒が含まれていることです。これは許可されていません。1 日分のすべてが必要な場合は、trunc関数を使用してこれを取得できます。

SELECT * FROM TEST_DATE WHERE trunc(EMP_DATE) = trunc(SYSDATE);

デフォルトtruncでは、日付列を操作するときに日付の時間部分を削除します。trunc(emp_date)通常、このクエリを最適化するために、関数インデックスをオンにすることをお勧めします。何かのようなもの:

create index i_test_date on test_date(trunc(emp_date));

これを実証するために、小さなSQL Fiddleを作成しました。

追加の問題があります。Oracle は ANSI 日付リテラルをサポートしていますが、2 番目のクエリは間違っています。常にto_date関数を使用して文字列を日付に明示的に変換します。

SELECT * FROM TEST_DATE WHERE EMP_DATE = to_date('01-07-2012','dd-mm-yyyy');

常に 7 月を意味するという保証はないため、代わりにmm 日時形式モデルを使用しました。それは、NLS パラメータ、特定のデータベースまたはセッションが使用している「日付言語」によって異なります。日時形式モデルは、日付に変換するために渡す文字列の形式をデータベースに伝える方法です。monJUL


興味がある場合は、2 番目のクエリの ANSI 構文は次のようになります。

SELECT * FROM TESt_DATE WHERE trunc(EMP_DATE) = DATE '2012-07-01'

機能するには、この形式 (YYYY-MM-DD) でなければなりません。

于 2012-06-30T21:54:24.900 に答える