2011-12-01 114 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