Нет записей, извлекаемых для записей за предыдущий день, используя SYSDATE - ORACLE - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть столбцы INSERT_TIME и UPDATE_TIME в моей таблице типа данных Date.Оба столбца, которые теперь содержат значение 24-FEB-2019 (для 10 записей).

Теперь я использую этот запрос, чтобы выбрать эти 10 записей, используя:

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table1 
WHERE  (insert_time = Trunc(To_date(sysdate)) - 1 ) 
        OR (update_time = Trunc(To_date(sysdate)) - 1 ) 
           AND table1_zipcode NOT IN(SELECT zipcode 
                                     FROM   SCHEMA.table2);

Этот запрос не выбирает записи и возвращает пустой результат.

Я также изменилзапрос вроде:

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table 
WHERE  ( insert_time = Trunc(sysdate) - 1 ) 
        OR ( update_time = Trunc(sysdate) - 1 ) 
           AND table1_zipcode NOT IN(SELECT zipcode 
                                     FROM   SCHEMA.table2); 

и

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table 
WHERE  ( insert_time = sysdate - 1 ) 
        OR ( update_time = sysdate) - 1 ) 
           AND table1_zipcode NOT IN(SELECT zipcode 
                                     FROM   SCHEMA.table2); 

Но, похоже, ничего не работает.Я что-то пропустил?Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 25 февраля 2019

Значения даты 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...