2011-12-01 115 views
1

我有一个表wchih有2列。该定义是基于SYSDATE获取列值

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

的colulmn 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。我在这个简单的日期操作中做错了什么?

回答

1

A DATE包含一天中的时间以及日期。

如果SYSDATE2011-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

你可以省略掉'TRUNC(TSTAMP)的TRUNC'因为如果'TRUNC(TSTAMP)> = TRUNC(SYSDATE - 1)',它永远是真实的'TSTAMP> = TRUNC(SYSDATE - 1 )'(如果在TSTAMP上有索引,删除它可能会提高性能)。 –

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