2
SQL> select * from porder ;

   OID       BILL ODATE
  ------ ---------- ---------
    10        200 06-OCT-13
     4      39878 05-OCT-13
     5     430000 05-OCT-13
    11        427 06-OCT-13
    12        700 06-OCT-13
    14      11000 06-OCT-13
    15      35608 06-OCT-13
    13      14985 06-OCT-13
     8      33000 06-OCT-13
     9        600 06-OCT-13
    16        200 06-OCT-13

   OID       BILL ODATE
------ ---------- ---------
     1        200 04-OCT-13
     2      35490 04-OCT-13
     3       1060 04-OCT-13
     6        595 05-OCT-13
     7        799 05-OCT-13

16 rows selected.  

 SQL> select * from porder where odate='04-Oct-2013';

no rows selected

誰か助けてください...なぜクエリが機能しないのですか..??

4

1 に答える 1

22

Oracle では、 にはDATE常に時間コンポーネントがあります。クライアントは時間コンポーネントを表示する場合と表示しない場合がありますが、等値比較を実行しようとすると表示されます。NLS_DATE_FORMATまた、暗黙的な変換を行うために現在のセッションを使用する文字列ではなく、日付を常に日付と比較したいため、かなり脆弱になります。これには、ANSI 日付リテラルまたは明示的なto_date呼び出しが含まれます

関数を使用して、を真夜中TRUNCに切り捨てることができますDATE

SELECT *
  FROM porder
 WHERE trunc(odate) = date '2013-10-04'

または、範囲比較を行うこともできます ( のインデックスの恩恵を受けることができれば、より効率的になりますodate) 。

SELECT *
  FROM porder
 WHERE odate >= to_date( '04-Oct-2013', 'DD-Mon-YYYY' )
   AND odate <  to_date( '05-Oct-2013', 'DD-Mon-YYYY' );
于 2013-10-07T02:29:34.607 に答える