2013-07-01 99 views
1

为什么这两个选择查询的Oracle 11g:比较日期

create table tmp (d date); 
insert into tmp (d) values (sysdate); 

select * from tmp where d = sysdate; 
select * from tmp where d = trunc(sysdate); 

都返回0行?

select to_timestamp(d), to_timestamp(sysdate) from tmp; 

清楚地表明,这两个列相等:

TO_TIMESTAMP(D)    | TO_TIMESTAMP(SYSDATE) 
July, 01 2013 00:00:00+0000 | July, 01 2013 00:00:00+0000 

SQL Fiddle example

+0

当我跑到你的代码,这两个查询*做*回报1行 - 但那是因为我是非常快,我在午夜时分运行它们:) –

回答

3

您的INSERT添加日期随着时间的推移,因为SYSDATE包含一个精确到一秒的时间分量。

你的第一个SELECT因为你运行它SYSDATE有不同的值,第二次或比你做的INSERT时间SYSDATE值更年长的时候什么都不会返回。

你的第二个SELECT什么也没有返回,因为它没有一天的时间。正如米西克指出的那样,如果你TRUNCSYSDATEtmp.d值,你会得到一个匹配。


TO_TIMESTAMP函数不是你想用来验证值的地方。它忽略了日期的时间部分。此查询...

SELECT TO_TIMESTAMP(TO_DATE('7/1/2013 12:34:56', 'MM/DD/YYYY HH24:MI:SS')) 
FROM DUAL; 

...将返回日期2013年7月2日只有,没有时间组件。

看看有什么真正的插入,做这样的事情,看看每个值的时间部分:

SELECT TO_CHAR(d, 'MM/DD/YYYY HH24:MI:SS') FROM tmp; 
3

当比较trunc(sysdate) - 你应该truncd太:

select * from tmp where trunc(d) = trunc(sysdate); 

简单d=sysdate不会WO rk,因为自insert之后sysdate发生了变化。

+0

当然,但是为什么对于这个查询'从dual'第一列中选​​择to_timestamp(sysdate),to_char(sysdate,'dd-MM-YYYY HH:MI:SS')是缺乏时间部分和第二不是? – Mixer

+1

由于默认的to_timestamp行为http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions193.htm – mishik