赞
踩
interval:时间间隔数据类型,有INTERVAL YEAR TO MONTH
和INTERVAL DAY TO SECOND两种类型。
1) INTERVAL YEAR TO
MONTH使用该数据类型来保存以月为精度的时间间隔信息
语法:INTERVAL YEAR(percision) TO MONTH;percision的取值范围为0-4.默认是2
SQL> create table testinterval(time INTERVAL
YEAR(0) TO MONTH);
表已创建。
SQL> alter table testinterval add (id number);
表已更改。
***********************************************************************************************
因为在定义中year的精度是0,所以time的最大值为11个月
***********************************************************************************************
SQL> INSERT INTO TESTINTERVAL(id,time)
VALUES(1,INTERVAL '3' YEAR);
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO TESTINTERVAL(id,time)
VALUES(1,INTERVAL '0-3' YEAR TO MONTH);
已创建 1 行。
SQL> INSERT INTO TESTINTERVAL(id,time)
VALUES(2,INTERVAL '3-3' YEAR TO MONTH);
INSERT INTO TESTINTERVAL VALUES(INTERVAL '3-3' YEAR TO MONTH)
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(2,INTERVAL '0-30' YEAR TO MONTH)
2 ;
INSERT INTO TESTINTERVAL(id,time)
VALUES(2,INTERVAL '0-30' YEAR TO MONTH)
*
第 1 行出现错误:
ORA-01843: 无效的月份
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(2,INTERVAL '0-12' YEAR TO MONTH);
INSERT INTO TESTINTERVAL(id,time)
VALUES(2,INTERVAL '0-12' YEAR TO MONTH)
*
第 1 行出现错误:
ORA-01843: 无效的月份
**************************************************************************************************
在设置了精度大于0时,可以仅指定year或者month来表示,仅指定month时且没有设置month(percision)如果year的精度>=2时最大值仅能为1199=99*12+11
因为该格式表示默认的year格式,精度为2.如果year的精度为1和mont的最大值为9*12+11=119,如果使用‘yy-mm’格式则mm最大为11;如果仅指定year则由精度来决定最大值
**************************************************************************************************SQL> alter table testinterval modify (time
INTERVAL YEAR(3) TO MONTH);
表已更改。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(3,INTERVAL '33-11' YEAR TO MONT
)
2 ;
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(4,INTERVAL '33-11' YEAR);
INSERT INTO TESTINTERVAL(id,time)
VALUES(4,INTERVAL '33-11' YEAR)
*
第 1 行出现错误:
ORA-01867: 间隔无效
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(4,INTERVAL '33' YEAR);---仅指定年表示33年
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '33' MONTH);
----指定月的值没有指定年的值,表示33个月
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(6,INTERVAL '100' MONTH);
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(7,INTERVAL '999'
YEAR);------year的默认精度是2所以度与999是超过精度了
INSERT INTO TESTINTERVAL(id,time)
VALUES(7,INTERVAL '999' YEAR)
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(7,INTERVAL '999' YEAR(3));
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(8,INTERVAL '1199' MONTH);
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(9,INTERVAL '1200' MONTH);
INSERT INTO TESTINTERVAL(id,time)
VALUES(9,INTERVAL '1200' MONTH)
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO TESTINTERVAL(id,time)
VALUES(7,INTERVAL '1200' MONTH(4));----可以设置month的精度来获取更大的值,该最大值受year的精度的限制
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(9,INTERVAL '1-12' year(3) to mon
th);
INSERT INTO TESTINTERVAL(id,time)
VALUES(9,INTERVAL '1-12' year(3) to month)
*
第 1 行出现错误:
ORA-01843: 无效的月份
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(9,INTERVAL '1-11' year(3) to mon
th);
已创建 1 行。
SQL> select * from testinterval;
ID TIME
---------- --------------------
1 +000-03 -------3个月
3 +033-11 ---------33年+11个月
4 +033-00
6 +008-04
7 +999-00
9 +001-11
7 +100-00
8 +833-04
8 +999-01
1) INTERVAL DAR TO
SECOND使用该数据类型来保存以秒为精度的时间间隔信息
语法:INTERVAL
DAY[(leading_precision)]TO
SECOND[(fractional_seconds_precision)];leading_precision和fractional_seconds_precision的取值范围是0-9.默认情况下leading_precision是2,fractional_seconds_precision是6。含义和INTERVAL
YEAR TO MONTH类似。
SQL> create table testinterval(id number,time
INTERVAL DAY(1) TO SECOND);
表已创建。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(1,INTERVAL '0 22:10:2.44444'day
to second);
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(2,INTERVAL '10' MINUTE);
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(3,INTERVAL '14399'
MINUTE);--14399=(9*24+23)*60+59
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(4,INTERVAL '14400' MINUTE);
INSERT INTO TESTINTERVAL(id,time)
VALUES(4,INTERVAL '14400' MINUTE)
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(3,INTERVAL '239'
hour);----239=9*24+23
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '240' hour);
INSERT INTO TESTINTERVAL(id,time)
VALUES(5,INTERVAL '240' hour)
*
第 1 行出现错误:
ORA-01873: 间隔的前导精度太小
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '33' day to hour);
INSERT INTO TESTINTERVAL(id,time)
VALUES(5,INTERVAL '33' day to hour)
*
第 1 行出现错误:
ORA-01867: 间隔无效
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '0 33' day to hour);
INSERT INTO TESTINTERVAL(id,time)
VALUES(5,INTERVAL '0 33' day to hour)
*
第 1 行出现错误:
ORA-01850: 小时值必须介于 0 和 23 之间
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '0 3' day to hour);
已创建 1 行。
SQL> INSERT INTO
TESTINTERVAL(id,time) VALUES(5,INTERVAL '0 22:33' day to minu
te);
已创建 1 行。
SQL> select * from testinterval;
ID TIME
---------- --------------------
1 +0 22:10:02.444440 ---------0天22小时20分2.44444秒
2 +0 00:10:00.000000
3 +9 23:59:00.000000
3 +9 23:00:00.000000----------9天23小时
5 +0 03:00:00.000000
5 +0 22:33:00.000000
已选择6行。
3)相关函数
NUMTOYMINTERVAL(n, 'interval_unit'),interval_unit可以为:
YEAR, MONTH,该函数是将某个数字转化为INTERVALTO
MONTH类型。得到的结果和INTERVAL n
YEAR/MONTH一样。
SQL> select interval '345' month(3) from
dual;
INTERVAL'345'MONTH(3)
------------------------------------------------------------
+028-09
SQL> select NUMTOYMINTERVAL(345,'MONTH') from
dual;
NUMTOYMINTERVAL(345,'MONTH')
-----------------------------------------------------
+000000028-09 ----可以看出该精度是9
NUMTODSINTERVAL(n, 'interval_unit'),nterval_unit可以为:
DAY, HOUR, MINUTE, SECOND,该含糊是某个数字转化为INTERVAL DAY TO
SECOND。得到的结果和INTERVAL n
DAY/MINUTE/HOUR/SECOND一样
SQL> select NUMTODSINTERVAL(345,'day') from
dual;
NUMTODSINTERVAL(345,'DAY')
-----------------------------------------------------------
+000000345
00:00:00.000000000 -----可以看出day和second的精度都是9
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。