Výsledkem aritmetiky časového razítka je datový typ INTERVAL. Máte tam INTERVALOVÝ DEN DO DRUHÉ...
Pokud chcete počet minut, jedním ze způsobů by bylo použití EXTRACT()
, například:
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 )
Případně můžete použít trik s daty:
select sysdate + (interval_difference * 1440) - sysdate
from (select systimestamp - (systimestamp - 1) as interval_difference
from dual )
„Triková“ verze funguje kvůli pořadí priority operátorů a rozdílům mezi aritmetikou data a časového razítka.
Zpočátku operace vypadá takto:
date + ( interval * number ) - date
Jak je uvedeno v dokumentaci:
Oracle vyhodnocuje výrazy uvnitř závorek před vyhodnocením výrazů vně.
První operace tedy provedla vynásobení intervalu 1 440. Interval, tj. diskrétní časový úsek, vynásobený číslem je další diskrétní časový úsek, viz dokumentace o datech a aritmetice intervalů. Takže výsledkem této operace je interval, takže nám zbývá:
date + interval - date
Operátor plus má zde přednost před mínusem. Důvodem může být to, že interval mínus datum je neplatná operace, ale z dokumentace také vyplývá, že tomu tak je (neříká to). První provedená operace je tedy datum + interval. Datum plus interval je datum. Zbývá jen
date - date
Podle dokumentace to má za následek celé číslo představující počet dní. Původní interval jste však vynásobili 1 440, takže to nyní představuje 1 440násobek počtu dnů, které by jinak měl. Zbývá vám počet sekund.
Stojí za zmínku, že:
Když intervalové výpočty vrátí hodnotu datetime, výsledkem musí být skutečná hodnota datetime nebo databáze vrátí chybu. Například následující dva příkazy vrátí chyby:
Metoda "trik" bude selže, zřídka, ale stále selže. Jako vždy je nejlepší to udělat pořádně.