2013-09-26 56 views
0

我試圖從ORACLE表中檢索其中一列中有昨天日期的ORACLE表中的記錄。我每天都有一份工作,每天只檢索昨天的記錄。前一天的搜索記錄

注意**列insert_date的類型是date

的這是兩個SQL語句我到目前爲止有:

SELECT distinct column1 
    FROM table1 
WHERE flag = 'N' 
    AND insert_date BETWEEN TRUNC(CURRENT_DATE-1) AND TRUNC(CURRENT_DATE) 
    AND ipaddress IS NOT NULL 
    AND ipaddress <> '0.0.0.0'; 

SELECT distinct column1 
    FROM table1 
WHERE flag = 'N' 
    AND insert_date 
     BETWEEN To_Timestamp(CONCAT (to_char(CURRENT_DATE-1),' 12:00:00 AM')) 
      AND To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
    AND ipaddress IS NOT NULL 
    AND ipaddress <> '0.0.0.0'; 

似乎因爲這兩個SQL語句產生相同的輸出。但是,我不是ORACLE的專家,所以我想問問社區是否有任何我不知道的「陷阱」。

+0

看起來像是你佔了'gotcha'= - 這是你希望這一天在午夜開始 - 不僅僅是一天前(包括分鐘) – Randy

+0

我希望能夠使用第一個sql,因爲執行速度比較快到第二個sql。我假設這是因爲在insert_date列 –

+0

上有一個範圍分區只是在另一部分的想法,而不是檢查ipaddress兩次除非nvl(ipaddress,'0.0.0.0')<>'0.0.0.0'除非當然這個列有索引問題。 – Diver

回答

0

使用between但從結束日期減去一秒。

insert_date between trunc(CURRENT_DATE-1) and trunc(CURRENT_DATE) - 1/86400 
+0

我們有超過50萬紀錄。這將嚴重影響性能,如果我截斷insert_date –

+0

取代我以前的答案考慮到大數據集。 – Diver

+0

這正是我用過的!謝謝 –

0

試試這個:

SELECT distinct column1 
FROM table1 
WHERE flag = 'N' AND 
    insert_date = trunc(sysdate-1,'DD') 
    and ipaddress is not null and ipaddress<>'0.0.0.0'; 

你的第一個查詢工作正常,但是當你想過濾數據單日你可能不需要使用between

0
to_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM')) 

是非常多餘的,我認爲這對其他的方法(trunc(current_date-1)

只有「疑難雜症」我能看到的原因是,隨着正好 12日的記錄:00:00am將包含在第二個查詢中,但不是第一個。

有一個非常簡單的方法來檢查任何這類問題:

SELECT distinct column1 
FROM table1 
WHERE flag = 'N' AND insert_date between trunc(CURRENT_DATE-1) 
    and trunc(CURRENT_DATE) and ipaddress is not null and ipaddress<>'0.0.0.0'; 
MINUS 
SELECT distinct column1 
FROM table1 
WHERE flag = 'N' 
     AND insert_date between To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM'))       and To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
     and ipaddress is not null and ipaddress<>'0.0.0.0'; 

SELECT distinct column1 
FROM table1 
WHERE flag = 'N' 
     AND insert_date between To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 12:00:00 AM'))       and To_Timestamp(Concat (to_char(CURRENT_DATE-1),' 11:59:59 PM')) 
     and ipaddress is not null and ipaddress<>'0.0.0.0'; 
MINUS 
SELECT distinct column1 
FROM table1 
WHERE flag = 'N' AND insert_date between trunc(CURRENT_DATE-1) 
    and trunc(CURRENT_DATE) and ipaddress is not null and ipaddress<>'0.0.0.0'; 

如果你從任何這些查詢的結果,那麼就意味着兩種方法不完全相等。