【问题标题】:Search records from previous day搜索前一天的记录
【发布时间】:2013-09-26 19:34:21
【问题描述】:

我正在尝试从 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 专家,所以我想问问社区是否有任何我不知道的“陷阱”。

【问题讨论】:

  • 看起来您正在考虑“陷阱”=-您希望这一天从午夜开始 - 而不是一天前(包括分钟)
  • 我希望使用第一个 sql,因为与第二个 sql 相比,它的执行速度要快得多。我假设这是因为 insert_date 列上有一个按范围划分的分区
  • 只是对另一部分的想法,而不是检查 ipaddress 两次 nvl(ipaddress, '0.0.0.0') '0.0.0.0' 除非当然存在索引问题那个专栏。
  • 因为我想在我的帖子中使用第一个 sql,所以我做了一个小改动以避免 '12am' 记录成为前一天的一部分。这是 sql:SELECT distinct column1 FROM table1 WHERE flag = 'N' AND insert_date BETWEEN TRUNC(CURRENT_DATE-1) AND TRUNC(CURRENT_DATE) - 1/86400 AND ipaddress IS NOT NULL AND ipaddress &lt;&gt; '0.0.0.0'; 我从 trunc(current_date) 中减去一秒 (1/24*60*60) 得到 [CURRENT_DATE-1 11:59:59PM]。感谢所有人提供的提示和信息,以确保我玩​​得安全:)

标签: sql database oracle date


【解决方案1】:

使用中间值,但从结束日期减去一秒。

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

【讨论】:

  • 我们拥有超过 5000 万条记录。如果我截断 insert_date,这将严重影响性能
  • 替换了我之前的答案以说明大数据集。
  • 这正是我使用的!谢谢
【解决方案2】:
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';

如果您从其中任何一个查询中获得结果,则意味着这两种方法并不完全相等。

【讨论】:

    【解决方案3】:

    试试这个:

    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

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 2020-12-20
      • 2013-01-23
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多