使用INTERVAL YEAR TO MONTH类型

Oracle Database 9i数据库引入了一种新特性,可以用来存储时间间隔。时间间隔的例子包括:

● 1年零3个月

● 25个月

● -3天5小时16分

● 1天7小时

● -56小时

注意:

不要混淆时间间隔与时间值或时间戳的概念。时间间隔记录的是一段时间长度(例如1年零3个月),而时间值或时间戳记录的是一个特定的日期和时间(例如2006年10月28日下午7点32分16秒)。

在本书假想的在线商店这个例子中,我们可能想在特定的一段时间内对某种商品打折。例如,可以让顾客使用优惠券,其有效期为几个月;或者为在几天内促销产品而打折。本节后面将介绍几个使用优惠券和促销的例子。

表5-10列出了时间间隔的类型。

表5-10  时间间隔类型

    

    

INTERVAL YEAR[

( years_precision)

]

TO MONTH

存储一个时间间隔,其单位为年和月;可以通过指定可选的years_precision参数来指定年的精度,该参数是一个09的整数。默认的精度为2,意思是可以在时间间隔中为年数存储两位数字。如果试图向表中添加一行年数超过INTERVAL YEAR TO MONTH列可以存储的记录,就会返回一个错误。时间间隔既可以存储正数,也可以存储负数

INTERVAL DAY[

( days_precision)

]

TO SECOND[

( seconds_precision)

]

存储一个时间间隔,其单位为天和秒;可以通过指定可选的days_precision参数来指定天的精度,该参数是一个0~9的整数,默认值为2。另外,还可以通过指定可选的seconds_precision参数来指定秒的小数部分的精度,该参数是一个0~9的整数,默认值为6。时间间隔既可以存储正数,也可以存储负数

接下来的几节将介绍如何使用时间间隔类型。

5.8.1  使用INTERVAL YEAR TO MONTH类型

INTERVAL YEAR TO MONTH类型可以用来存储单位为年和月的时间间隔。下面这条语句创建一个名为coupons的表,用来存储优惠券信息。coupons表包含了一个INTERVAL YEAR TO MONTH类型的列duration,该列用来记录优惠券有效的时间间隔。注意,此处指定了duration列的精度为3,这就是说可以为该列的年数部分存储3位数字:

 CREATE TABLE coupons (
coupon_id INTEGER CONSTRAINT coupons_pk PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
duration INTERVAL YEAR(3) TO MONTH
);

要向数据库提供一个INTERVAL YEAR TO MONTH字面值,可以使用下面的简化语法:

INTERVAL '[+|-][y][-m]' [YEAR[( years_precision)])] [TO MONTH]

其中

● + 或 - 是一个可选的指示符,用来说明时间间隔是正数还是负数(默认为正数)。

● y 是一个可选参数,表示时间间隔的年数部分。

● m 是一个可选参数,表示时间间隔的月数部分。如果指定了年数和月数,必须在INTERVAL子句中包含TO MONTH。

● year_precision是一个可选参数,用来说明年数的精度(默认为2)。

表5-11给出了几个INTERVAL YEAR TO MONTH类型的时间间隔字面量的例子。

表5-11  时间间隔字面量的例子

时间间隔字面量

说明

INTERVAL '1' YEAR

时间间隔为1

INTERVAL '11' MONTH

时间间隔为11个月

INTERVAL '14' MONTH

时间间隔为14个月(等于1年零2个月)

INTERVAL '1-3' YEAR TO MONTH

时间间隔为1年零3个月

INTERVAL '0-5' YEAR TO MONTH

时间间隔为05个月

INTERVAL '123' YEAR(3) TO MONTH

时间间隔为123年,精度为3位数字

INTERVAL '-1-5' YEAR TO MONTH

时间间隔为负数,值为1年零5个月

INTERVAL '1234' YEAR(3)

时间间隔无效:1234包含4位数字,因此它包含的数字超过了精度(只允许最多3位数字)所允许的范围

下面这个INSERT语句向coupons表添加一行记录,并将duration列设置为如上表所示的有效时间间隔:

 INSERT INTO coupons (coupon_id, name, duration)
VALUES (1, '$1 off Z Files', INTERVAL '1' YEAR);
INSERT INTO coupons (coupon_id, name, duration)
VALUES (2, '$2 off Pop 3', INTERVAL '11' MONTH);
INSERT INTO coupons (coupon_id, name, duration)
VALUES (3, '$3 off Modern Science', INTERVAL '14' MONTH);
INSERT INTO coupons (coupon_id, name, duration)
VALUES (4, '$2 off Tank War', INTERVAL '1-3' YEAR TO MONTH);
INSERT INTO coupons (coupon_id, name, duration)
VALUES (5, '$1 off Chemistry', INTERVAL '0-5' YEAR TO MONTH);
INSERT INTO coupons (coupon_id, name, duration)
VALUES (6, '$2 off Creative Yell', 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 off Z Files', INTERVAL '1234' YEAR(3))
*
ERROR at line 2:
ORA-01873: the leading precision of the interval is too small

下面这个查询对coupons表进行检索,注意duration列值的格式化:

 SELECT *
FROM coupons;

COUPON_ID   NAME                              DURATION
---------- ------------------------------ ----------
1    $1 off Z Files                   +001-00
2    $2 off Pop 3                     +000-11
3    $3 off Modern Science            +001-02
4    $2 off Tank War                  +001-03
5    $1 off Chemistry                 +000-05
6    $2 off Creative Yell             +123-00


posted @ 2009-08-19 07:58  道场  阅读(545)  评论(0编辑  收藏  举报