2013-04-18 12 views
5

Mam kolumny datetime w Oracle (MM/DD/YYYY HH: MM: SS AM/PM), ale kiedy to zrobić:Odejmij jedna godzina z datetime niż jeden dzień

SELECT MAX(D_DTM)-1 FROM tbl1 

. ... wraca dzień. Jak usunąć godzinę z kolumny zamiast jednego dnia?

Zauważyłam również, że datetime rekordy dla 12am wyglądać MM/DD/YYYY i nie MM/DD/YYYY 00:00:00; Nie jestem pewien, czy to ma znaczenie.

+0

Jak masz podgląd wartości 12am? Czy jest to przez SQLPlus lub język front-end (C#, PHP itp.)? –

+0

za pomocą Ropucha, jest z przodu problem?Jestem nowy w Oracle env – user2061886

+0

To może być TOAD, ale nie znam TOADa. Jeśli wszystkie pozostałe daty w kolumnie pokazują składnik czasu i daty "północy", myślę, że można bezpiecznie założyć, że "północ" naprawdę istnieje, a TOAD po prostu "pomocnie" to ukrywa. Może istnieć ustawienie, w którym można włączyć lub wyłączyć tę funkcję, ale to tylko zgadnij. Wiem, że języki .NET i PHP rozpoznają porę czasu - nawet jeśli jest zero - i prawdopodobnie każdy inny język też będzie. –

Odpowiedz

13

Randy's answer jest dobre, ale można też użyć przedziałów:

SELECT MAX(D_DTM)- interval '1' hour FROM tbl1 
+0

lepsza odpowiedź IMO, bardziej zrozumiałe dla przyszłych programistów, aby wiedzieć, co się dzieje – user2061886

4

tak - daty są podawane jako liczby całkowite.

jeśli chcesz godzin trzeba zrobić trochę matematyki - jak -(1/24)

5

lub skorzystać z funkcji INTERVAL. Jest to ten sam wynik, ale myślę, że to brzmi lepiej - to oczywiście tylko opinia :)

SELECT MAX(D_DTM) - INTERVAL '1' HOUR FROM tbl1 

Zaletą funkcji INTERVAL jest to, że można zrobić odstęp mieć lat, miesięcy, dni, godzin , minuty lub sekundy, gdy mamy do czynienia z wartością DATE, chociaż interwał miesięczny może być trudny w przypadku dat końca miesiąca.

I tak, cytat z 1 w tym przykładzie jest wymagany.

Można również użyć Oracle specyficzne NumToDSInterval funkcję, która jest mniejsza średnia ale bardziej elastyczny, ponieważ przyjmuje zmienne zamiast stałych:

SELECT MAX(D_DTM) - NUMTODSINTERVAL(1, 'HOUR') FROM tbl1 
2

Inny sposób korzystania z interwałem

NUMTODSINTERVAL(number, expression) 

przykłady

NUMTODSINTERVAL(150, 'DAY') 
NUMTODSINTERVAL(1500, 'HOUR') 
NUMTODSINTERVAL(15000, 'MINUTE') 
NUMTODSINTERVAL(150000, 'SECOND') 

Podnoszę to, bo używaj go przydaje się w sytuacjach, w których używanie INTERWAŁU nie będzie działać.

4
select sysdate - numtodsinterval(1,'hour') from dual 
1

To proste.

sysdate - 5/(24 x 60 x 60) -> odejmuje 5 sekund od systime

SYSDATE - 5/(24 x 60) -> 5 minut odejmowane od systime

SYSDATE - 5/(24) -> Odejmuje 5 godzin z systime

Stąd

select (sysdate - (1:24)) z podwójną

+0

Czy możesz bardziej rozwinąć swoją odpowiedź, na przykład dlaczego używasz podziału na odjęcie? –

+0

@CodyGuldner Podział oblicza wartość jako ułamek dni. (1 godzina to 1/24 dnia, więc 5/24 dni to 5 godzin.) Odejmowanie to odejmuje dzień. Osobiście martwiłbym się jednak błędami zmiennoprzecinkowymi. – jpmc26

+0

@ jpmc26 Pomysł polega na tym, że informacje takie powinny znaleźć się w odpowiedzi. –

Powiązane problemy