Wynikiem arytmetyki znacznika czasu jest typ danych INTERVAL. Masz tam DZIEŃ PRZERWY DO DRUGIM...
Jeśli chcesz liczbę minut, jednym sposobem byłoby użycie EXTRACT()
, na przykład:
select extract( minute from interval_difference ) * 60
+ extract( hour from interval_difference ) * 60
+ extract( day from interval_difference ) * 60 * 24
from ( select systimestamp - (systimestamp - 1) as interval_difference
from dual )
Alternatywnie możesz użyć triku z datami:
select sysdate + (interval_difference * 1440) - sysdate
from (select systimestamp - (systimestamp - 1) as interval_difference
from dual )
Wersja „sztuczki” działa ze względu na kolejność operatorów i różnice między arytmetyką daty i znacznika czasu.
Początkowo operacja wygląda tak:
date + ( interval * number ) - date
Jak wspomniano w dokumentacji:
Oracle ocenia wyrażenia w nawiasach przed oceną tych na zewnątrz.
Tak więc pierwsza operacja wykonała to, aby pomnożyć interwał przez 1440. Przedział, czyli dyskretny okres czasu pomnożony przez liczbę to kolejny dyskretny okres czasu, patrz dokumentacja dotycząca daty i czasu oraz arytmetyki przedziałów. Tak więc wynikiem tej operacji jest interwał, pozostawiając nam:
date + interval - date
Operator plus ma tutaj pierwszeństwo przed minusem. Powodem tego może być to, że interwał minus data jest nieprawidłową operacją, ale dokumentacja również sugeruje, że tak jest (nie pojawia się i tego nie mówi). Tak więc pierwsza wykonywana operacja to data + interwał. Data plus interwał to data. Pozostawienie tylko
date - date
Zgodnie z dokumentacją daje to liczbę całkowitą reprezentującą liczbę dni. Jednak pomnożyłeś pierwotny interwał przez 1440, więc teraz oznacza to 1440 razy liczbę dni, które miałby w innym przypadku. Pozostaje Ci liczba sekund.
Warto zauważyć, że:
Gdy obliczenia interwałowe zwracają wartość daty i godziny, wynik musi być rzeczywistą wartością daty i godziny lub baza danych zwraca błąd. Na przykład, następne dwie instrukcje zwracają błędy:
Metoda „sztuczki” będzie zawodzi, rzadko, ale i tak zawiedzie. Jak zawsze najlepiej robić to właściwie.