Литералы типа INTERVAL
сходны с литералами TIMESTAMP
; они используются для вставки интервальных значений в виде констант в программный код. Литералы типа INTERVAL
имеют следующий синтаксис:
INTERVAL 'символьное_представление' начальный_элемент TO конечный_элемент
Здесь символьное_представление
— символьная строка, представляющая интервал (описание представления двух типов интервалов в символьной форме приводится выше, в разделе «Преобразования интервалов»); начальный_элемент
задает начальный элемент интервала, а конечный_элемент
задает конечный элемент интервала.
В отличие от функций TO_YMINTERVAL
и TO_DSINTERVAL
, литералы INTERVAL
позволяют задать интервал с использованием любой последовательности элементов даты/времени (см. табл. 10.2). Существует только два ограничения: элементы должны быть последовательными, и в одном интервале не допускается переход от месяцев к дням. Приведем несколько примеров:
DECLARE
y2ma INTERVAL YEAR TO MONTH;
y2mb INTERVAL YEAR TO MONTH;
d2sa INTERVAL DAY TO SECOND;
d2sb INTERVAL DAY TO SECOND;
BEGIN
/* Несколько примеров интервалов YEAR TO MONTH */
y2ma := INTERVAL '40-3' YEAR TO MONTH;
y2mb := INTERVAL '40' YEAR;
/* Примеры интервалов DAY TO SECOND */
d2sa := INTERVAL '10 1:02:10.123' DAY TO SECOND;
/* Не работает в Oracle9i - 11gR2 из-за ошибки */
--d2sb := INTERVAL '1:02' HOUR TO MINUTE;
/* Два обходных способа задания интервала HOUR TO MINUTE,
представляющего только часть интервала DAY TO SECOND range. */
SELECT INTERVAL '1:02' HOUR TO MINUTE
INTO d2sb
FROM dual;
d2sb := INTERVAL '1' HOUR + INTERVAL '02' MINUTE;
END;
Начиная с Oracle9i и вплоть до Oracle11g Release 2, выражения вида INTERVAL
'1:02' HOUR TO MINUTE
, в которых не указывается значение каждого возможного элемента, могут использоваться в командах SQL, но не в командах PL/SQL. Более того, при выполнении программы будет выдано сообщение об использовании ключевого слова BULK
в неверном контексте. По всей вероятности, эта ошибка будет исправлена в следующих выпусках продукта.
Oracle нормализует значения интервалов, что весьма удобно. В следующем примере 72 часа 15 минут преобразуются в 3 дня, 0 часов и 15 минут:
DECLARE
d2s INTERVAL DAY TO SECOND;
BEGIN
SELECT INTERVAL '72:15' HOUR TO MINUTE INTO d2s FROM DUAL;
DBMS_OUTPUT.PUT_LINE(d2s);
END;
Результат:
+03 00:15:00.000000
Oracle почему-то нормализует только старшие значения (часы в данном примере). Попытка задать интервал 72:75 (72 часа и 75 минут) приведет к ошибке.