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
请有人帮忙......为什么查询不起作用.. ??
答案 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' );