oracle interval 每天,oracle interval type

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值