Как вычесть часы с даты в Oracle, так что это влияет и на день

Я пытаюсь вычесть дату из Oracle, так что это даже влияет на день. Например, если отметка времени 01/июня/2015 00 часов, и если я вычитаю 2 часа, я хочу, чтобы я мог перейти к 31/май/2014 22 часа.

Я пробовал

to_char(sysdate-(2/11), 'MM-DD-YYYY HH24')

но он только вычитает час; он не касается самого дня.

Ответ 1

Другие отметили (неправильное) использование 2/11, чтобы указать желаемый интервал.

Я лично предпочитаю писать такие вещи, используя ANSI interval литералы, которые облегчают чтение запроса:

sysdate - interval '2' hour

У него также есть преимущество быть портативным, многие СУБД поддерживают это. Кроме того, мне не нужно запускать калькулятор, чтобы узнать, сколько часов это выражение означает: я довольно плохо с умственной арифметикой;)

Ответ 2

date - n вычитает указанную дату в форме n дней. Чтобы вычесть hrs, вам нужно преобразовать его в дневную купюру, разделив ее на 24. В вашем случае это должно быть to_char(sysdate - (2 + 2/24), 'MM-DD-YYYY HH24'). Это приведет к получению 2 дней и 2 часа от sysdate.

Ответ 3

Попробуйте следующее:

SELECT to_char(sysdate - (2 / 24), 'MM-DD-YYYY HH24') FROM DUAL

Чтобы проверить это, используя новый экземпляр даты:

SELECT to_char(TO_DATE('11/06/2015 00:00','dd/mm/yyyy HH24:MI') - (2 / 24), 'MM-DD-YYYY HH24:MI') FROM DUAL

Выход: 06-10-2015 22:00, что является предыдущим днем.

Ответ 4

sysdate- (2/11)

Чтобы вычесть часы из DATE, вам нужно преобразовать часы в дни. День состоит из 24 hours, поэтому для преобразования 2 hours в дни вам нужно разделить его на 24.

Теперь, чтобы вычесть 2 часа из даты, выполните:

DATE_value - 2/24

Например,

SQL> SELECT TO_CHAR(
  2                 TO_DATE('01/Jun/2015 00:00:00', 'DD/Mon/YYYY HH24:MI:SS') - 2/24,
  3         'DD/Mon/YYYY HH24:MI:SS') dt
  4  FROM DUAL;

DT
--------------------
31/May/2015 22:00:00

SQL>