interval ---OCP--047--218
INTERVAL数据类型用来存储两个时间戳之间的时间间隔。可以指定years and months,或者days,hours,minuts,seconds之间的间隔。
ORACLE支持两种INTEVAL类型,它们分别是YEAR TO MONTH和DAY TO SECOND。每个类型都包含leading field和trailing field。主参数定义要被计算的date或者time,副参数定义最小增长量。
一、INTERVAL YEAR TO MONTH
声明INTERVAL YEAR TO MONTH的语法是:
其中:
- 'INTEGER[-INTEGER],为leading field以及可选的trailing field指定具体的数值。同时month即trailing field的取值范围是0到11。
- percision,即精度,是对leading field的数值的最大长度的限制。取值范围为0-9,默认值是2。
代码一:
DECLARE v_inteval INTERVAL YEAR (3) TO MONTH; BEGIN v_inteval := INTERVAL '123-2' YEAR TO MONTH; DBMS_OUTPUT.put_line (v_inteval); END;
结果为:+123-02。说明:表示123年2个月。在这个例子中,必须指定YEAR,即leading field的精度(percision),因为默认值为2,如果将声明部分修改为:v_inteval INTERVAL YEAR TO MONTH;会提示精度太小错误。另外,需要注意的是,声明部分需要标注精度,但是赋值部分,即v_inteval := INTERVAL '123-2' YEAR TO MONTH;不需要标注精度,如果标注,会提示语法错误。在本例中,如果精度修改为4,则结果为+0123-02。
代码二:
select INTERVAL '1234' YEAR(4) from dual;
结果为:+1234-00。说明:表示1234年0个月。因为INTERVAL类型之一,INTERVAL YEAR TO MONTH,声明时YEAR(leading field)和MONTH(trailing field)必须同时存在,否则会提示错误信息。所以,如果我们单独引用YEAR或者MONTH时,代码二的例子无法编译通过,只能通过sql语句。
类似的例子还有:
select INTERVAL '345' MONTH(3) from dual;
结果为:+28-09
例:
INTERVAL '123-2' YEAR(3) TO MONTH;
--表示: 123年2个月, "YEAR(3)" 表示年的精度为3, 可见"123"刚好为3为有效数值, 如果该处YEAR(n), n<3就会出错, 注意默认是2.
INTERVAL '123' YEAR(3); --表示: 123年0个月 INTERVAL '300' MONTH(3); --表示: 300个月, 注意该处MONTH的精度是3啊. INTERVAL '4' YEAR; --表示: 4年, 同 INTERVAL '4-0' YEAR TO MONTH 是一样的 INTERVAL '50' MONTH; --表示: 50个月, 同 INTERVAL '4-2' YEAR TO MONTH 是一样 INTERVAL '123' YEAR; --表示: 该处表示有错误, 123精度是3了, 但系统默认是2, 所以该处应该写成 INTERVAL '123' YEAR(3) 或"3"改成大于3小于等于9的数值都可以的 INTERVAL '5-3' YEAR TO MONTH + INTERVAL '20' MONTH = INTERVAL '6-11' YEAR TO MONTH; --表示: 5年3个月 + 20个月 = 6年11个月
与该类型相关的函数:
NUMTODSINTERVAL(n, 'interval_unit')
将n转换成interval_unit所指定的值, interval_unit可以为: DAY, HOUR, MINUTE, SECOND
注意该函数不可以转换成YEAR和MONTH的.
NUMTOYMINTERVAL(n, 'interval_unit')
interval_unit可以为: YEAR, MONTH
二、INTERVAL DAY TO SECOND
声明INTERVAL DAY TO SECOND的语法是:
其中:
- INTEGER指定days的数值,数值不能超过leading_percision。
- time_expr指定格式为HH[:MI[:SS[.n]]]or MI[:SS[.n]] or SS[.n]的时间,n是second的小数部分,n的长度不能大于fractional_seconds_precision,并受限于fractional_seconds_precision的位数。如果leading field为day,则可以选择integer time_expr的模式。
- leading_precision为leading_field的精度,取值范围为0-9,默认值为2。
- fractional_seconds_precision为秒的精度取值范围1-9,默认值为6。
- HOUR的取值范围为0-23,MINUTE的取值范围为0-59,MINUTE的取值范围为0-59.999999999。
DECLARE v_inteval INTERVAL DAY (7) TO SECOND (5); BEGIN v_inteval := INTERVAL '4 5:12:10.222' DAY TO SECOND; DBMS_OUTPUT.put_line (v_inteval); END;
结果为:++0000004 05:12:10.22200。
说明:表示4天5小时12分10.222秒。在这个例子中,DAY以及SECOND的精度都是可选的,类似INTERVAL YEAR TO MONTH,声明部分需要标注精度,但是赋值部分,不需要标注精度,如果标注,会提示语法错误。
select INTERVAL '4 5:12' DAY TO MINUTE from dual;
结果为:+04 05:12:00。
说明:表示4天5小时12分0秒。因为INTEVAL类型之一,INTERVAL DAY TO SECOND,声明时DAY和SECOND必须同时存在,否则会提示错误信息。所以,如果我们单独引用YEAR或者MONTH时,代码二的例子无法编译通过,只能通过sql语句。
select INTERVAL '400 5' DAY(3) TO HOUR from dual; select INTERVAL '400' DAY(3) from dual; select INTERVAL '11:12:10.2222222' HOUR TO SECOND(7) from dual; select INTERVAL '11:20' HOUR TO MINUTE from dual; select INTERVAL '10' HOUR from dual; select INTERVAL '10:22' MINUTE TO SECOND from dual; select INTERVAL '10' MINUTE from dual; select INTERVAL '120' HOUR(3) from dual; select INTERVAL '30.12345' SECOND(2,4) from dual; --(注意,该结果为+00 00:00:30.1235,如果精度为1,3,则结果为+0 00:00:30.123,如果精度为3,7,则结果为+000 00:00:30.1234500)