2015-06-11 20 views
10

Próbuję odjąć datę od Oracle, aby wpłynąć nawet na dzień. Na przykład, jeśli znacznik czasu to 01/czerwiec/2015 00 godzin i jeśli odejmę 2 godziny, chcę móc przejść do 31/maja/2014 22 godzin.Jak odjąć godziny od daty w Oracle, aby miało to wpływ również na dzień

Próbowałem

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

ale tylko odejmuje godzinę; nie dotyka samego dnia.

+0

Co sprawia, że ​​myślisz "- (2/11)" odejmuje 2 godziny? To nie jest oczywisty zapis. Wygląda na to, że może odjąć '0.22' jednostek jakiegoś rodzaju - oceniam, czy to są dni, sekundy, czy jakaś inna jednostka. –

+3

@ JonathanLeffler: w Oracle wyrażenie 'date_value - integer' zawsze oznacza' date_value - number of days'. Wartości ułamkowe są interpretowane jako godziny. Jednak 2/11 jest dość zaciemnionym sposobem na określenie oczekiwanej wartości. Osobiście zawsze używam literałów przedziałów ANSI dla czegoś takiego: 'sysdate - interval '2' hour' –

+0

@a_horse_with_no_name: Dzięki - to ma sens. Podstawową jednostką Oracle DATE są dni, a czas to ułamki dnia. Moja pamięć jest zepsuta; 2/11 = 0.1818181818 ... i 2/9 = 0.2222222222 ... Nadal nie wydaje się, że 2/11 jest sposobem na określenie nawet 2 godzin (jest to nieco ponad 4 godziny). –

Odpowiedz

0

Spróbuj tego:

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

Aby przetestować go przy użyciu nowej instancji data:

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

wyjściowa wynosi: 06-10-2015 22:00 który poprzedniego dnia.

1

date - n odejdzie n dni od podanej daty. Aby odjąć godziny, musisz przekonwertować je na dzień zakupu, dzieląc je na 24. W twoim przypadku powinno być to_char(sysdate - (2 + 2/24), 'MM-DD-YYYY HH24'). Spowoduje to zignorowanie 2 dni i 2 godzin od sysdate.

0

sysdate- (2/11)

Aby odjąć Godziny z DATA, trzeba konwertować godzin w dni. Dzień składa się z 24 hours, więc aby przekonwertować 2 hours na dni, musisz podzielić go przez 24.

Teraz odjąć 2 godziny tworzą datę, wykonaj następujące czynności:

DATE_value - 2/24 

Na przykład

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> 
21

Inni komentowali (niewłaściwego) użytkowania 2/11 aby określić żądany interwał.

Osobiście jednak wolę pisanie takich rzeczy wykorzystujących ANSI interval literałów co sprawia czytanie zapytanie znacznie łatwiejsze:

sysdate - interval '2' hour 

Ma też tę zaletę, że przenośny wielu DBMS obsługuje. Poza tym nie muszę uruchamiać kalkulatora, aby sprawdzić, ile godzin oznacza wyrażenie - jestem dość zły z arytmetyką umysłową;)

Powiązane problemy