oracle中的INTERVAL函数详解
INTERVAL YEAR TO MONTH数据类型
Oracle语法:
INTERVAL integer [ integer] {YEAR | MONTH} [(precision)][TO {YEAR | MONTH}]
该数据类型常用来表示一段时间差 注意时间差只精确到年和月 precision为年或月的精确域 有效范围是到 默认值为
eg:
INTERVAL YEAR() TO MONTH
表示: 年个月 YEAR() 表示年的精度为 可见刚好为为有效数值 如果该处YEAR(n) n<就会出错 注意默认是
INTERVAL YEAR()
表示: 年个月
INTERVAL MONTH()
表示: 个月 注意该处MONTH的精度是啊
INTERVAL YEAR
表示: 年 同 INTERVAL YEAR TO MONTH 是一样的
INTERVAL MONTH
表示: 个月 同 INTERVAL YEAR TO MONTH 是一样
INTERVAL YEAR
表示: 该处表示有错误 精度是了 但系统默认是 所以该处应该写成 INTERVAL YEAR() 或改成大于小于等于的数值都可以的
INTERVAL YEAR TO MONTH + INTERVAL MONTH =
INTERVAL YEAR TO MONTH
表示: 年个月 + 个月 = 年个月
与该类型相关的函数:
NUMTODSINTERVAL(n interval_unit)
将n转换成interval_unit所指定的值 interval_unit可以为: DAY HOUR MINUTE SECOND
注意该函数不可以转换成YEAR和MONTH的
NUMTOYMINTERVAL(n interval_unit)
interval_unit可以为: YEAR MONTH
eg: (Oracle Version RedHat Linux )
SQL> select numtodsinterval(DAY) from dual;
NUMTODSINTERVAL(DAY)
+ ::
SQL> c/DAY/SECOND
* select numtodsinterval(SECOND) from dual
SQL> /
NUMTODSINTERVAL(SECOND)
+ ::
SQL> c/SECOND/MINUTE
* select numtodsinterval(MINUTE) from dual
SQL> /
NUMTODSINTERVAL(MINUTE)
+ ::
SQL> c/MINUTE/HOUR
* select numtodsinterval(HOUR) from dual
SQL> /
NUMTODSINTERVAL(HOUR)
+ ::
SQL> c/HOUR/YEAR
* select numtodsinterval(YEAR) from dual
SQL> /
select numtodsinterval(YEAR) from dual
*
ERROR at line :
ORA: illegal argument for function
SQL> select numtoyminterval(year) from dual;
NUMTOYMINTERVAL(YEAR)
+
SQL> c/year/month
* select numtoyminterval(month) from dual
SQL> /
NUMTOYMINTERVAL(MONTH)
+
时间的计算:
SQL> select to_date(yyyymmdd) to_date(yyyymmdd) from dual;
TO_DATE(YYYYMMDD)TO_DATE(YYYYMMDD)
可以相减的结果为天
SQL> c//
* select to_date(yyyymmdd) to_date(yyyymmdd) from dual
SQL> /
TO_DATE(YYYYMMDD)TO_DATE(YYYYMMDD)
也可以为负数的
SQL> c//
* select to_date(yyyymmdd) to_date(yyyymmdd) from dual
SQL> /
TO_DATE(YYYYMMDD)TO_DATE(YYYYMMDD)
下面看看INTERVAL YEAR TO MONTH怎么用
SQL> create table bb(a date b date c interval year() to month);
Table created
SQL> desc bb;
Name Null? Type
A DATE
B DATE
C INTERVAL YEAR() TO MONTH
SQL> insert into bb values(to_date( yyyymmdd) to_date(yyyymmdd) null)
row created
SQL> select * from bb;
A B
C
DEC DEC
SQL> update bb set c = numtoyminterval(ab year);
row updated
SQL> select * from bb;
A B
C
DEC DEC
+
直接将相减的天变成年了 因为我指定变成年的
SQL> select ab c from bb;
AB
C
+
SQL> insert into bb values(nullnullnumtoyminterval(month));
row created
SQL> select * from bb;
A B C
DEC DEC +
+
SQL> insert into bb values ( nullnull numtoyminterval(year));
row created
SQL> select * from bb;
A B C
DEC DEC +
+
+
========================
INTERVAL YEAR TO MONTH类型个TIMESTAMP类型的时间差别内部类型是长度是其中个字节存储年份差异存储的时候在差异上加了一个X的偏移量一个字节存储月份的差异这个差异加了的偏移量
SQL> ALTER TABLE TestTimeStamp ADD E INTERVAL YEAR TO MONTH;
SQL> update testTimeStamp set e=(select interval year + interval month year from dual);
已更新行
SQL> commit;
提交完成
SQL> select dump(e) from testTimeStamp;
DUMP(E)
Typ= Len=:
Typ= Len=:
Typ= Len=:
年XX=
月x=
INTERVAL DAY TO SECOND数据类型
Oracle语法:
INTERVAL { integer | integer time_expr | time_expr }
{ { DAY | HOUR | MINUTE } [ ( leading_precision ) ]
| SECOND [ ( leading_precision [ fractional_seconds_precision ] ) ] }
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]
leading_precision值的范围是到 默认是 time_expr的格式为:HH[:MI[:SS[n]]] or MI[:SS[n]] or SS[n] n表示微秒
该类型与INTERVAL YEAR TO MONTH有很多相似的地方建议先看INTERVAL YEAR TO MONTH再看该文
范围值:
HOUR: to
MINUTE: to
SECOND: to
eg:
INTERVAL :: DAY TO SECOND()
表示: 天小时分秒
INTERVAL : DAY TO MINUTE
表示: 天小时分
INTERVAL DAY() TO HOUR
表示: 天小时 为为精度所以DAY() 注意默认值为
INTERVAL DAY()
表示: 天
INTERVAL :: HOUR TO SECOND()
表示: 小时分秒
INTERVAL : HOUR TO MINUTE
表示: 小时分
INTERVAL HOUR
表示: 小时
INTERVAL : MINUTE TO SECOND
表示: 分秒
INTERVAL MINUTE
表示: 分
INTERVAL DAY
表示: 天
INTERVAL HOUR
表示: 小时
INTERVAL MINUTE
表示: 分
INTERVAL HOUR()
表示: 小时
INTERVAL SECOND()
表示: 秒 因为该地方秒的后面精度设置为 要进行四捨五入
INTERVAL DAY INTERVAL HOUR = INTERVAL DAY TO SECOND
表示: 天 小时 = 天秒
==================
INTERVAL DAY TO SECOND类型存储两个TIMESTAMP之间的时间差异用日期小时分钟秒钟形式表示该数据类型的内部代码是长度位字节
l 个字节表示天数(增加X偏移量)
l 小时分钟秒钟各用一个字节表示(增加偏移量)
l 个字节表示秒钟的小时差异(增加X偏移量)
以下是一个例子
SQL> alter table testTimeStamp add f interval day to second ;
表已更改
SQL> update testTimeStamp set f=(select interval day + interval second from dual);
已更新行
SQL> commit;
提交完成
SQL> select dump(f) from testTimeStamp;
DUMP(F)
Typ= Len=: cc
Typ= Len=: cc
Typ= Len=: cc
日期XX=
小时=
分钟=
秒钟=
秒钟小数部分XX=