1

Why these two select queries

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

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

both return 0 rows?

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

clearly shows that both columns are equal:

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

SQL Fiddle example

4

2 回答 2

3

比较时trunc(sysdate)- 你也应该trunc d

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

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

于 2013-07-01T14:57:38.890 回答
3

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

您的第一个SELECT没有返回任何内容,因为当您运行它时,它SYSDATE具有不同的值,比SYSDATE您执行INSERT.

您的第二个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;
于 2013-07-01T15:09:18.420 回答