您不应该直接将日期与字符串进行比较。您依赖于隐式转换,其规则很难记住。
此外,您选择的日期格式不是最佳的:年份有四位数字(Y2K 错误?),并且并非所有语言都将一年中的第七个月命名为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
始终将日期与日期进行比较,将字符串与字符串进行比较。相关问题: