为什么这两个选择查询
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
答案 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
SYSDATE
和tmp.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;