Резултатът от аритметиката на времевата марка е тип данни INTERVAL. Имате ИНТЕРВАЛЕН ДЕН ДО ВТОРИ там...
Ако искате броя на минутите, единият начин би бил да използвате EXTRACT()
, например:
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 )
Като алтернатива можете да използвате трик с дати:
select sysdate + (interval_difference * 1440) - sysdate
from (select systimestamp - (systimestamp - 1) as interval_difference
from dual )
Версията "трик" работи поради реда на приоритета на оператора и разликите между аритметиката за дата и време.
Първоначално операцията изглежда така:
date + ( interval * number ) - date
Както е посочено в документацията:
Oracle оценява изразите в скоби, преди да оценява тези извън.
И така, първата операция я извърши, за да умножи интервала по 1440. Един интервал, т.е. дискретен период от време, умножен по число, е друг дискретен период от време, вижте документацията за дата и време и интервална аритметика. И така, резултатът от тази операция е интервал, оставяйки ни с:
date + interval - date
Тук операторът плюс има предимство пред минус. Причината за това може да е, че интервал минус дата е невалидна операция, но документацията също предполага, че това е така (не излиза и не го казва). И така, първата извършена операция е дата + интервал. Дата плюс интервал е дата. Напускане само
date - date
Според документацията това води до цяло число, представляващо броя на дните. Въпреки това, вие умножихте първоначалния интервал по 1440, така че това сега представлява 1440 пъти броя дни, които иначе би имал. След това оставате с броя на секундите.
Струва си да се отбележи, че:
Когато интервалните изчисления връщат стойност за дата и час, резултатът трябва да бъде действителна стойност за дата и час или базата данни връща грешка. Например следващите две изрази връщат грешки:
Методът "трик" ще се проваля, рядко, но пак ще се провали. Както винаги, най-добре е да го направите както трябва.