日付を文字列と直接比較しないでください。ルールを覚えるのが難しい暗黙の変換に依存している。
さらに、日付形式の選択は最適ではありません。年は 4 桁であり (Y2K バグ?)、すべての言語で 7 番目の月が という名前であるわけではありませんJUL
。のようなものを使用する必要がありますYYYY/MM/DD
。
最後に、Oracle の日付は秒単位まで正確な時点です。日付であっても、すべての日付には時刻コンポーネントがあり00:00:00
ます。演算子を使用する=
と、Oracle は日付と時刻を比較します。
あなたが説明した動作を再現するテストケースを次に示します。
SQL> create table test_date (d date);
Table created
SQL> alter session set nls_date_format = 'DD-MON-RR';
Session altered
SQL> insert into test_date values
2 (to_date ('2007/07/30 11:50:00', 'yyyy/mm/dd hh24:mi:ss'));
1 row inserted
SQL> select * from test_date where d = '30-JUL-07';
D
-----------
SQL> select * from test_date where d like '30-JUL-07';
D
-----------
30/07/2007
演算子を使用する=
と、Oracle は定数文字列を日付に変換し30-JUL-07
、次のように値を列と比較します。
SQL> select * from test_date where d = to_date('30-JUL-07', 'DD-MON-RR');
D
-----------
演算子を使用するLIKE
と、Oracle は列を文字列に変換し、右辺と比較します。これは次のようになります。
SQL> select * from test_date where to_char(d, 'DD-MON-RR') like '30-JUL-07';
D
-----------
30/07/2007
常に日付と日付、文字列と文字列を比較してください。関連する質問: