Выбрать главу

строку с большим количеством цифр продолжительности интервала

в годах, чем может содержать столбец 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: