17

まず、この質問が一般的にEquals(=) vs. LIKEに投稿されていることを認識しています。ここで、ORACLE データベースの日付型データについてクエリを実行します。このように select ステートメントを記述すると、次のことがわかりました。

SELECT ACCOUNT.ACCOUNT_ID, ACCOUNT.LAST_TRANSACTION_DATE
FROM ACCOUNT
WHERE ACCOUNT.LAST_TRANSACTION_DATE LIKE '30-JUL-07';

探しているすべての行を取得します。しかし、=代わりに等しい記号を使用すると:

SELECT ACCOUNT.ACCOUNT_ID, ACCOUNT.LAST_TRANSACTION_DATE
FROM ACCOUNT
WHERE ACCOUNT.LAST_TRANSACTION_DATE = '30-JUL-07';

等号以外は何も変わらないのに何も得られません。これについての説明を見つけてもらえますか?

4

3 に答える 3

7

日付を文字列と直接比較しないでください。ルールを覚えるのが難しい暗黙の変換に依存している。

さらに、日付形式の選択は最適ではありません。年は 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

常に日付と日付、文字列と文字列を比較してください。関連する質問:

于 2013-08-29T08:21:19.033 に答える
1

日付フィールドは文字列ではありません。を使用すると、文字列に内部的に暗黙的な変換が行われますが、文字列に=必要な精度がないため、これは何にも一致しません。

LIKEステートメントは日付フィールドで多少異なる動作をするため、精度の要件を排除する比較で暗黙のワイルドカードが使用されると思います。基本的に、あなたのLIKE作品は次のようになります。

SELECT ACCOUNT.ACCOUNT_ID, ACCOUNT.LAST_TRANSACTION_DATE
FROM ACCOUNT
WHERE ACCOUNT.LAST_TRANSACTION_DATE BETWEEN DATE('30-JUL-07 00:00:00.00000+00:00') AND DATE('30-JUL-07 23:59:59.99999+00:00');
于 2013-08-29T08:08:42.287 に答える