2013-09-26 3 views
0

Я пытаюсь получить записи из таблицы ORACLE, которые имеют вчерашнюю дату в одном из столбцов. У меня есть работа, выполняющая ежедневный поиск ТОЛЬКО вчерашних записей.Поиск записей с предыдущего дня

NOTE ** столбец 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, поэтому я хотел бы спросить сообщество, есть ли какие-либо «gotchas», о которых я не знаю.

+0

похоже, что вы учли «gotcha» = - это то, что вы хотите, чтобы день начался в полночь - не один день назад (включая минуты) – Randy

+0

Я надеялся использовать первый sql, так как выполняет намного быстрее на второй sql. Я предполагаю, что это потому, что есть раздел по диапазону в столбце insert_date –

+0

просто мысль на другой части, но вместо того, чтобы дважды проверять ipaddress, как насчет nvl (ipaddress, '0.0.0.0') <> '0.0.0.0', если только конечно, есть проблемы с индексацией с этим для этого столбца. – Diver

ответ

0

Используйте пробел, но вычитайте секунду с даты окончания.

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'; 

Если вы получите результаты от любого из этих запросов, то это означает, что два подхода не совсем равным.

Смежные вопросы