пятница, 15 августа 2008 г.

Oracle. Перевод интервала времени в секунды.

Недавна столкнулся с типовой и тривиальнейшей задачей:

Есть время начала, время окончания. Нужно вычислить интервал между двумя этими временами в секундах, при чём сделать это на Oracle PL/SQL.

Но как оказалось, здесь Oracle ставит нам подножку, т.к. не даёт человеческого способа сделать это. В Oracle результат операции разницы двух дат (переменных типа timestamp) является переменная типа interval. Так вот функции, которая конвертировала бы этот interval в секунды (минуты, часы, дни) нет.

Немного поискав, я понял что не одинок в поиске решения задачи.

Вот и получается что приходится извращаться:

SQL> select
2 EXTRACT(YEAR FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) YEAR to month) YEAR,
3 EXTRACT(month FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) YEAR to month) month,
4 EXTRACT(day FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) days,
5 EXTRACT(hour FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) hour,
6 EXTRACT(minute FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) minute,
7 EXTRACT(second FROM (to_date('2008-07-13 17:48:34')-to_date('2005-06-15 15:22:01')) day to second) second
8 from dual;

YEAR MONTH DAYS HOUR MINUTE SECOND
---------- ---------- ---------- ---------- ---------- ----------
3 1 1124 2 26 33