0RA-01873: the le a d in g p re c is io n o f the in t e r v a l i s too sm a ll
(0RA-01873: главная разрядность интервала слишком мала)
Следующий запрос выбирает строки из таблицы coupons, чтобы можно
было видеть форматирование значений столбца duration:
□ SELECT *
FROM coupons;
C0UP0N_ID NAME DURATION
1 $1 o f f Z f i l e s +001-00
168 Глава 5
2 $2 o f f Pop 3 +000-11
3 $3 o f f Modern Science +001-02
4 $2 o f f Tank War +001-03
5 $2 o f f Chemistry +000-05
6 $2 o f f Creative Yell +123-00
Использование типа INTERVAL DAY TO SECOND
Тип INTERVAL DAY TO SECOND используется для хранения интервалов, измеряемых
в днях и секундах. Следующий оператор создает таблицу
promotions, в которой хранится информация о специальных рекламных
предложениях. Таблица предложений имеет столбец duration типа INTER VAL
DAY ТО SECOND, где хранится интервал времени, в течение которого действуют
эти специальные предложения:
□ CREATE TABLE promotions (
promotion_id INTEGER CONSTRAINT promotions_pk PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
duration INTERVAL DAY(3) TO SECOND (4)
);
Указана разрядность 3 для количества дней и разрядность 4 для количества
дробных знаков секунд столбца duration. Это означает, что можно
хранить до трех цифр количества дней интервала и иметь до четырех
цифр справа от десятичной точки в количестве секунд интервала.
Для представления базе данных литерального значения INTERVAL DAY ТО
SECOND можно использовать следующий упрощенный синтаксис:
□ INTERVAL ' [+ ]| [- ][d ] [ h [ :m [ :s ] ] ] ' [0АТ[(разрядность_дней)]])
[TO HOUR | MINUTE | SEC0ND[( разрядность_секунд)] ]
где
■ + (или -) - необязательный индикатор, указывающий, будет интервал
положительным (принимается по умолчанию) или отрицательным;
■ d - число дней в интервале;
■ h - необязательное количество часов в интервале; если указываются
дни и часы, то нужно включить в литерал фразу ТО HOUR;
■ m - необязательное количество минут в интервале; если указываются
дни и минуты, то нужно включить в свой литерал фразу ТО
MINUTES;
■ s - необязательное количество секунд в интервале; если указываются
дни и секунды, то нужно включить в свой литерал фразу ТО SECOND;
■ разрядность_^дней - необязательная разрядность для дней (значение
по умолчанию 2);
■ разрядность_секунд - необязательная разрядность для дробных долей
секунд (значение по умолчанию равно 6).
В приведенной ниже таблице показано несколько примеров литералов
типа INTERVAL DAY ТО SECOND.
Хранение и обработка дат и времени 169
Литерал
INTERVAL
INTERVAL
INTERVAL
INTERVAL
INTERVAL 1
MINUTE
INTERVAL 1
SECOND
•3’ DAY
’ 2' HOUR
’ 25’ MINUTE
•45' SECOND
3 2:25’ DAY TO
3 2:25 :4 5’ DAY TO
INTERVAL 4 2 3 2:2 5 :4 5 .1 2 ’
DAY(3) TO SEC0ND(2)
INTERVAL
SECOND
INTERVAL
SECOND
‘ 3 2:00 :4 5’ DAY TO
-3 2:25 :4 5’ 'DAY TO
INTERVAL '1234 2:25 :4 5’
DAY(3) TO SECOND
INTERVAL ‘ 123 2:25 :4 5.1 23’
DAY TO SEC0ND(2)
Описание
Интервал продолжительностью 3 дня.
Интервал продолжительностью 2 ч.
Интервал продолжительностью 25 мин.
Интервал продолжительностью 45 сек.
Интервал продолжительностью 3 дня 2 ч
и 25 мин.
Интервал продолжительностью 3 дня 2 ч
25 мин и 45 сек.
Интервал продолжительностью 123 дня
2 ч 25 мин и 45.12 сек; разрядность дней
составляет 3 цифры, а разрядность дробных
долей секунды - 2 цифры.
Интервал продолжительностью 3 дня 2 ч
О мин и 45 сек.
Отрицательный интервал продолжительностью
3 дня 2 ч 25 мин и 45 сек.
Недопустимый интервал, так как число
цифр дней превышает максимальную
разрядность (3).
Недопустимый интервал, поскольку количество
цифр дробной доли секунд превышает
указанную разрядность (3).
Следующий оператор INSERT добавляет строки в таблицу promotions,
причем значения столбца duration устанавливаются на какой-либо из допустимых
интервалов, показанных в предыдущей таблице:
□ INSERT INTO promotions (promotion_id, name, d u ra tio n )
VALUES (1,
INSERT INTO
VALUES (2,
INSERT INTO
VALUES (3,
INSERT INTO
VALUES (4,
INSERT INTO
VALUES (5,
INSERT INTO
VALUES (6,
o f f Z F i l e s ’ , INTERVAL ‘ 3 ’ DAY);
promotions (promotion_id, name, d u ra tio n )
20% o f f Pop 3 ’ , INTERVAL ‘ 2 ’ HOUR);
promotions (promotion_id, name, d u ra tio n )
30% o f f Modern S c ie n c e ’ , INTERVAL ‘ 25’ MINUTE);
promotions (promotion_id, name, d u ra tio n )
20% o f f Tank WAR’ , INTERVAL ‘ 45’ SECOND);
promotions (promotion_id, name, d u ra tio n )
10% o f f C h em istry ’ , INTERVAL ‘ 3 2 :2 5 ’ DAY TO MINUTE);
promotions (promotion_id, name, d u ra tio n )
20% o f f C re a tiv e Y e l l ' ,
INTERVAL ‘ 3 2:25 :4 5’ DAY TO SECOND);
170 Глава 5
INSERT INTO promotions (promotion_id, name, d u ra tio n )
VALUES (7, ‘ 15% o f f My Front L in e ’ ,
INTERVAL ‘ 123 2 :2 5 :4 5 .1 2 ’ DAY(3) TO SEC0ND(2));
Следующий запрос выбирает строки из таблицы promotions, чтобы ознакомить