web-dev-qa-db-ja.com

LESS THAN OR OracleSQLと同等

updated_date  = 08-Jun-2010;

このようなクエリがあります

select * from asd whre updated_date <= todate('08-Jun-2010', 'dd-MM-yy');

しかし、私は何の結果も得ていません。 todateが2010年6月9日である場合にのみ機能します。

つまり、equalto演算子が正しく機能していません。

なんでそんなの?

9
Andromeda

Oracleでは、DATEは特定の時点です。常に秒単位の精度の時間成分があります。 todate('08-Jun-2010', 'dd-Mon-yyyy')はOracleではtodate('08-Jun-2010 00:00:00', 'dd-Mon-yyyy hh24:mi:ss')と同じです。したがって、その日付までの行を選択した場合、その日の時間コンポーネントが00:00に等しくない行は取得されません。

08-JUN-2010までのすべての行を選択する場合は、次を使用することをお勧めします。

< to_date('09-06-2010', 'dd-MM-yyyy')

または

<= to_date('08-06-2010 23:59:59', 'dd-MM-yyyy hh24:mi:ss')

-日付形式を修正しました。省略形の月名を使用する場合は、MONを使用する必要があります。代わりにMMを使用することをお勧めします。これにより、誰かがクライアント設定(NLS_DATE_LANGUAGE)を変更したときにエラーが発生しなくなります。また、YYYYの代わりにYYを使用することをお勧めします。

25
Vincent Malgrat

これをチェックして、

select to_date('08-Jun-2010', 'dd-MON-yyyy') from dual;

2010-06-08 00:00:00と同じです。時間に注意してください。

updated_dateには時間部分があります。それらを含めるには、このクエリを使用してください、

select * from asd where trunc(updated_date) <= to_date('08-Jun-2010', 'dd-MON-yyyy');

DateパラメータのデフォルトのTRUNC関数は、時間を削除します。

参照 Trunc

13
Sujee