根据SYSDATE获取列值

时间:2011-12-01 21:16:15

标签: oracle date oracle10g dml

我有一张桌子,有两列。定义是

CREATE TABLE LOGGING_T
(
  TSTAMP  DATE,
  LINE    VARCHAR2(300)
)
TABLESPACE OPERATIONS
MONITORING
/

列号TSTAMP的值为30-NOV-1129-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)

然后,它会抓取TSTAMP30-NOV-11的记录。我在这个简单的日期操作中做错了吗?

2 个答案:

答案 0 :(得分:1)

DATE包含一天中的时间和日期。

如果SYSDATE2011-12-01 1:18:00 PM,则SYSDATE-12011-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