Как вычесть часы с даты в 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>