Oracle SQL比较日期

时间:2013-10-07 02:01:26

标签: sql oracle

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

请有人帮忙......为什么查询不起作用.. ??

1 个答案:

答案 0 :(得分: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' );