【发布时间】: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 <> '0.0.0.0';我从 trunc(current_date) 中减去一秒 (1/24*60*60) 得到 [CURRENT_DATE-1 11:59:59PM]。感谢所有人提供的提示和信息,以确保我玩得安全:)