Oracle 11g:比较DATE

时间:2013-07-01 14:54:08

标签: sql oracle

为什么这两个选择查询

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

2 个答案:

答案 0 :(得分:3)

比较trunc(sysdate)时,您应该trunc d

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

简单d=sysdate将不起作用,因为自插入以来sysdate已更改。

答案 1 :(得分:3)

您的INSERT添加了日期与时间,因为SYSDATE包含时间组件,精确到一秒。

您的第一个SELECT没有返回任何内容,因为在您运行它时,SYSDATE具有不同的值,比您SYSDATE时的INSERT值更早或更长{1}}。

你的第二个SELECT没有返回任何内容,因为它没有时间。正如mishik所指出的,如果你TRUNC SYSDATEtmp.d值,你就会得到一个匹配。


TO_TIMESTAMP函数不是您在此处验证值所需的函数。它忽略了日期的时间部分。这个查询...

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

...将返回日期为7/2/2013 ,没有时间组件。

要查看实际插入的内容,请执行以下操作以查看每个值的时间组件:

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