строку с большим количеством цифр продолжительности интервала
в годах, чем может содержать столбец INTERVAL YEAR ТО MONTH,
появится сообщение об ошибке. Хранимые интервалы могут быть как
положительными, так и отрицательными.
interval Для хранения временного интервала, измеряемого в днях и секундах,
DAY[ (разрядность, можно определить (необязательную) разрядность дней, если указать
дней)] ТО SECOND дополнительный параметр разрядность^ней, который может быть
[ (разрядность_се- целым числом от 0 до 9. Разрядность по умолчанию равняется 2; это
кунд) ] означает, что можно записать не более чем двузначную продолжительность
интервала в днях. Кроме того, можно указать дополнительную
разрядность для дробной части секунд, если представить дополнительный
параметр разрядность_секунд в виде целого числа от 0 до
9 (значение по умолчанию равно 6). Хранимые интервалы могут быть
как положительными, так и отрицательными.
166 Глава 5
□
Использование типа INTERVAL YEAR ТО MONTH
Тип INTERVAL YEAR ТО MONTH используется для хранения временных
интервалов, измеренных в годах и месяцах. В следующем операторе создается
таблица coupons, в которой хранится информация о купонах. В этой
таблице есть столбец duration типа INTERVAL YEAR ТО MONTH для хранения
интервала времени, в течение которого купон действителен:
CREATE TABLE coupons (
coupon_id INTEGER CONSTRAINT coupons_pk PRIMARY KEY,
name VARCHAR2(30) NON NULL,
duration INTERVAL YEAR(3) TO MONTH
Для продолжительности интервала (столбец duration) указана разрядность
3. Это означает, что в годичной части интервала может быть записано
не более трех цифр.
Для представления базе данных литерального значения типа INTERVAL
YEAR ТО MONTH можно использовать следующий упрощенный синтаксис:
INTERVAL '[+ | - ][y ][-m ]' [ДЕАР[(разрядность_лет)])] [ТО MONTH]
где
■ знаки + или - являются необязательным индикатором, специфицирующим,
будет интервал положительным (принимается по умолчанию)
или отрицательным;
■ у является необязательным количеством лет для интервала;
■ m является необязательным числом месяцев для интервала. Если
представляются значения и для лет, и для месяцев, в литерале должна
присутствовать фраза ТО MONTH;
■ разрядностьюет является необязательным параметром, определяющим
разрядность (количество цифр) продолжительности интервала
в годах (значение по умолчанию равно 2).
В приведенной ниже таблице показаны некоторые примеры литералов
интервала год-месяц.
Описание
Интервал продолжительностью 1 год.
Интервал продолжительностью 11 месяцев.
Интервал продолжительностью 14 месяцев (эквивалентен
интервалу в 1 год и 2 месяца).
Интервал продолжительностью 1 год и 3 месяца.
Литерал
INTERVAL
INTERVAL
INTERVAL
Г YEAR
11' MONTH
14' MONTH
INTERVAL
TO MONTH
INTERVAL
TO MONTH
1-3’ YEAR
‘ 0-5’ YEAR Интервал продолжительностью 0 лет и 5 месяцев.
INTERVAL 4 23’
YEAR(3) ТО MONTH
Интервал продолжительностью 123 года и с разрядностью
в 3 цифры.
Хранение и обработка дат и времени 167
INTERVAL ‘ -1 - 5 ’ YEAR Отрицательный интервал продолжительностью
ТО MONTH 1 год и 5 месяцев.
INTERVAL ‘ 1234’ Недействительный интервал: в литерале 1234 со-
YEAR (3) держится 4 десятичные цифры, что является недопустимым
для объявленной разрядности 3 (которая
разрешает хранить не более трех цифр).
Следующий оператор INSERT добавляет строки к таблице coupons, в
которых столбец duration устанавливается равным какому-либо допустимому
интервалу, показанному в предыдущей таблице:
□ INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (1, '$1 o f f Z F i l e s ’ , INTERVAL ' 1 ’ YEAR);
INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (2, ‘ $2 o f f Pop 3 ’ , INTERVAL 4 1 ' MONTH);
INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (3, ‘ $3 o f f Modern. S c ie n c e ’ , INTERVAL ‘ 14’ MONTH);
INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (4, ‘ $2 o f f Tank War’ , INTERVAL ‘ 1 -3 ’ YEAR TO MONTH);
INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (5, ‘ $1 o f f C h em is try ’ , INTERVAL ‘ 0 -5 ’ YEAR TO MONTH);
INSERT INTO coupons (coupon_id, name, d u ra tio n )
VALUES (6, ‘ $2 o f f C re a tiv e Y e l l ’ , INTERVAL ‘ 123’ YEAR(3));
Если попытаться добавить строку, в которой столбец duration установлен
на недопустимое значение интервала, например INTERVAL ‘ 1234’
YEAR(3), приходит сообщение об ошибке, потому что разрядность столбца
duration равна 3 и, следовательно, слишком мала. Следующий оператор
INSERT показывает эту ошибку:
□ SQL INSERT INTO coupons (coupon_id, name, duration)
2 VALUES (7, ‘$1 off Z Files', INTERVAL ‘1234’ YEAR(3));
VALUES (7, ‘ $1 o f f Z F i l e s ’ , INTERVAL ‘ 1234’ YEAR(3));
*
ERROR at lin e 2: