2013-09-26 53 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'; 

如果你从任何这些查询的结果,那么就意味着两种方法不完全相等。