使用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参数来指定年的精度,该参数是一个0~9的整数。默认的精度为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位数字:
要向数据库提供一个INTERVAL YEAR 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 |
时间间隔为0年5个月 |
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列设置为如上表所示的有效时间间隔:
如果试图添加一行duration列无效的时间间隔记录:INTERVAL '1234' YEAR(3),数据库就会报错,因为duration列的精度为3,因此太小了。下面这条INSERT语句就显示了这种错误:
下面这个查询对coupons表进行检索,注意duration列值的格式化:
COUPON_ID NAME DURATION |