Обновление записей в таблице на основе разницы часов между датами - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь обновить записи в таблицах, которые старше 24 часов (1 день).Я думал о разнице в день вместо часов, используя следующий запрос:

UPDATE Testing 
SET STS_CD='02'
WHERE EXTRACT(DAY FROM SYSTIMESTAMP)- EXTRACT(DAY FROM UPD_DTM)> 1

Теперь может возникнуть ситуация, когда мы должны проверять записи, которые имеют возраст 12 или 36 часов.Итак, я должен принимать разницу только по часам.И я не получаю правильный результат, пытаясь получить разницу на основе часов.Можете ли вы предложить?

UPDATE Testing 
SET STS_CD='02'
WHERE EXTRACT(HOURS FROM SYSTIMESTAMP)- EXTRACT(HOURS FROM UPD_DTM)> 24

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

, если тип столбца UPD_DTM имеет метку времени:

UPDATE Testing  
SET STS_CD='02' 
WHERE  extract (day from (systimestamp -UPD_DTM )) >1;

, если тип столбца UPD_DTM имеет дату:

UPDATE Testing 
SET STS_CD='02'
WHERE  sysdate-UPD_DTM >1;
0 голосов
/ 24 сентября 2018

Столбец UPD_DTM представляется значением TIMESTAMP, в этом случае я бы порекомендовал

UPDATE Testing 
SET STS_CD='02'
WHERE SYSTIMESTAMP - UPD_DTM > INTERVAL '1' DAY

Если вам нужна разница в часах, вы также можете использовать

WHERE SYSTIMESTAMP - UPD_DTM > INTERVAL '24' HOUR

Когда вы используете EXTRACT(HOURS FROM ...), тогда вы получаете только значение часа.

Например, EXTRACT(HOUR FROM TIMESTAMP '2018-09-24 15:00:00')- EXTRACT(HOUR FROM TIMESTAMP '2018-09-22 14:00:00') результат равен просто 1 (час), фактически разница составляет 49 часов, т.е.2 дня и 1 час (+02 01:00:00.000000)

У вас похожая проблема с EXTRACT(DAY FROM SYSTIMESTAMP)- EXTRACT(DAY FROM UPD_DTM), например EXTRACT(DAY FROM TIMESTAMP '2018-09-22 15:00:00')- EXTRACT(DAY FROM TIMESTAMP '2018-08-22 14:00:00') возвращает 0, хотя разница составляет один месяц!

В случае, если выиметь индекс по столбцу UPD_DTM, тогда для лучшей производительности предпочтительнее

WHERE UPD_DTM < SYSTIMESTAMP - INTERVAL '1' DAY
0 голосов
/ 24 сентября 2018

Дата арифметики работает с количеством дней, если вы не хотите что-то другое.Например, если вы вычтете столбец даты и число 2 (upd_dtm - 2), вы получите «два дня назад».

Обновление строк, столбец даты которых находится в течение последних 1 дня (или 24 часов)тогда будет

UPDATE Testing 
SET STS_CD = '02'
WHERE upd_dtm > sysdate - 1

или where upd_dtm > sysdate - 24/24 (так как один день имеет 24 часа).

Посмотрите и на это;может помочь вам в будущем:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

SQL> select
  2    sysdate - 1 one_day_ago,
  3    sysdate - 12/24 twelve_hours_ago,
  4    sysdate - 36/24 thirty_six_hours_ago
  5  from dual;

ONE_DAY_AGO      TWELVE_HOURS_AGO THIRTY_SIX_HOURS
---------------- ---------------- ----------------
23.09.2018 09:38 23.09.2018 21:38 22.09.2018 21:38

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...