我有一张桌子,有两列。定义是
CREATE TABLE LOGGING_T
(
TSTAMP DATE,
LINE VARCHAR2(300)
)
TABLESPACE OPERATIONS
MONITORING
/
列号TSTAMP的值为30-NOV-11
,29-NOV-11
......等等。现在我在做这个查询
select * from LOGGING_T where TSTAMP >= (SYSDATE - 1)
当前系统日期为01-DEC-11
。理想情况下,上述语句应返回TSTAMP = 30-NOV-11
的记录,因为我正在SYSDATE-1
30-NOV-11
。但它并没有取得那些记录。为什么?
但是,如果我执行此查询
select * from LOGGING_T where TSTAMP >= (SYSDATE - 2)
然后,它会抓取TSTAMP
为30-NOV-11
的记录。我在这个简单的日期操作中做错了吗?
答案 0 :(得分:1)
DATE
包含一天中的时间和日期。
如果SYSDATE
为2011-12-01 1:18:00 PM
,则SYSDATE-1
为2011-11-30 1:18:00 PM
。
您希望在时间元素之前或之后的11月30日找到的行吗?
如果您不关心时间,只想根据日期进行过滤,则可以使用TRUNC()
:
select *
from LOGGING_T
where TRUNC(TSTAMP) >= TRUNC(SYSDATE - 1);
您可能会或可能不想确保比较运算符的两边都是TRUNC()
,因为TRUNC()
只会强制日期的时间元素为午夜。
select to_char(trunc(sysdate), 'YYYY-MM-DD HH:MI:SS PM')
from dual;
NOW
----------------------
2011-12-01 12:00:00 AM
答案 1 :(得分:1)
值SYSDATE也具有时间组件。很可能数据库中的日期也有时间组件。
将您的查询更改为:
select * from LOGGING_T where TSTAMP >= TRUNC(SYSDATE - 1)
查看昨天从00:00开始记录的所有记录。
要查看实际的时间成分,请使用char。
SQL> select sysdate from dual;
SYSDATE
---------
01-DEC-11
1* select to_char(sysdate,'DD-Mon-YYYY HH24:MI:SS') date1 from dual
SQL> /
DATE1
--------------------
01-Dec-2011 16:29:01