Значения даты Oracle, включая sysdate
, включают время.Иногда это полночь для всех строк, когда столбец предназначен только для записи части даты.В вашем случае это не так, и у вас будет время в течение дня.(Это подтверждается именами столбцов, но тем более из-за того, что вы в настоящее время не получаете совпадений.)
Если ваш клиент показывает вам значения как 24-FEB-2019, тогда вы можете 'сказать, какая часть времени у них есть;вы можете изменить настройки клиента или NLS или указать полную модель формата даты / времени как часть запроса с помощью to_char(insert_time, 'YYYY-MM-DD HH24:MI:SS')
.
Когда вы делаете:
(insert_time = Trunc(To_date(sysdate)) - 1 )
, вы неявнопреобразование sysdate
из даты в строку с использованием вашего текущего NLS_DATE_FORMAT
, а затем неявное преобразование его обратно в дату с использованием той же модели формата.Учитывая вашу ссылку на 24-FEB-2019, этой моделью является DD-MON-YYYY, что означает, что вы фактически теряете часть времени в этом преобразовании - to_date()
даст вам начальную дату в полночь.(Кто-то другой, работающий с другими настройками NLS, может не увидеть, какой эффект.) Затем trunc()
устанавливает время в полночь, которая в этот момент фактически ничего не делает с вашими настройками NLS.И затем вы вычитаете день.
Когда вы делаете:
( insert_time = Trunc(sysdate) - 1 )
, вы пропускаете преобразование в строку и из строки, и на этот раз trunc()
устанавливаетчасть времени до полуночи.
В обоих случаях вы просматриваете записи, которые ровно в полночь - то есть, где insert_time
точно 2019-02-24 00:00:00.Поскольку вы не находите никаких строк, ни одна из ваших табличных данных на эту дату не находится ровно в полночь, что, вероятно, неудивительно.
Когда вы делаете:
( insert_time = sysdate - 1 )
вы не находитесьбольше не устанавливаем часть времени на полночь, но это означает, что если вы запустите это сегодня, скажем, 15:51:37, то вы будете сопоставлять только те строки, где inert_time
было точно 2019-02-24 15:15:37, чтовозможно, но маловероятно, если у вас есть только 10 строк в этот день.Каждое выполнение проверяет разное время, так что в конечном итоге может повезти ...
Если вы хотите найти строки вчера в любое время, вы можете сделать:
(insert_time >= trunc(sysdate) - 1 and insert_time < trunc(sysdate))
, который ищет что-нибудь вили после полуночи вчера (sysdate -1), но также раньше, чем полночь сегодня.И то же самое для update_time
, с соответствующими скобками для контроля логической оценки.
SELECT /*+parallel(8)*/ *
FROM SCHEMA.table1
WHERE (
(insert_time >= trunc(sysdate) - 1 AND insert_time < trunc(sysdate))
OR (update_time >= trunc(sysdate) - 1 AND update_time < trunc(sysdate))
)
AND table1_zipcode NOT IN(SELECT zipcode FROM SCHEMA.table2);