Sysdate vs Timestamp для сравнения - PullRequest
1 голос
/ 10 марта 2012

Я проверяю наличие обновлений продукта, зависящих от времени суток, - оповещаю, если продукт не обновлялся в течение последних 2 часов, например ::10000**1002.

03: 30 - 07:29 мы ожидаем обновления только продукта x;
07:30 - 11:29 мы ожидаем, что оба продукта x и y будут обновляться
11:30 - 15:30 мы ожидаем обновления только продукта y

Но мы должны быть внимательны к продуктам, которые не обновили вчера и еще не обновили сегодня . Таким образом, мой вопрос - при выполнении приведенных ниже сравнений меток времени для продукта y, я подозреваю, что дата не учитывается, и поэтому продукт, который не был обновлен, потенциально игнорируется.

(...)
AND inv.timestamp      < sysdate        - (120 / 1440) --older than two hours
AND inv.timestamp      > TRUNC(sysdate) + (690/1440)   --after 11:30
AND inv.timestamp      < TRUNC(sysdate) + (930/1440)   --before 15:30
(...)

inv.timestamp - это столбец типа timestamp (6). Включает ли trunc (sysdate) неявную дату для сравнения или использует только время?

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

TRUNC(SYSDATE) возвращает 00:00:00 текущего дня.

SQL> select trunc(sysdate) from dual;

TRUNC(SYSDATE)
-------------------
2012-03-09 00:00:00

Документация по TRUNC

0 голосов
/ 14 марта 2012

Как уже заметили Эолсон и Бен, SYSDATE включает дату и время. Использование TRUNC «удаляет» элемент времени, то есть сбрасывает его до полуночи этого дня.

Возможно, вы захотите рассмотреть возможность использования функциональности INTERVAL, предоставляемой Oracle, чтобы прояснить, что делает SQL, например,

SELECT to_char(trunc(sysdate) + interval '11' hour + interval '30' minute,'dd/mm/yyyy  hh24:mi:ss') sysdate_trunced_to_1130,
       to_char(trunc(current_timestamp) + interval '11' hour + interval '30' minute,'dd/mm/yyyy hh24:mi:ss') timestamp_trunced_to_1130
FROM dual; 

Взглянув на код, «(690/1440)» не сразу предлагает 11:30 утра, но, надеюсь, интервал «11» час + интервал «30» минут немного лучше.

...