oracle中的单行函数(三)
Oracle默认的时间呈现格式是:DD-MON-YYOracle存储时间的范围是:January 1, 4712 B.C. to December31, 9999 AD。实际上使用数值的格式来存储的,所以用户可以对时间进行运算操作。
MONTHS_BETWEEN(d1, d2),计算d1与d2的月份差。返回的月份是带小数点的,可以使用trunc或者round得到
需要的值。
SQL> select title,trunc(months_between(orderdate,pubdate),0) "Month"
2 from books join orderitems using (isbn)
3 join orders using(order#)
4 where order#=1004;
TITLE Month
------------------------------ ----------
PAINLESS CHILD-REARING 56 //计算订购日期与出版日期相差多少个月.
ADD_MONTHS(d, m) d表示开始计算的起始时间,M表示需要增加的月份的数.计算出增加m个月后的今天是什么日期。
SQL> select add_months(sysdate,5) from dual;
ADD_MONTH
---------
26-JUL-12 //7个月以后的今天是2012-07-12.
NEXT_DAY(d, DAY),d表示的是开始计算起始的日期,day表示下一个星期的星期几的日期。
SQL> select next_day(sysdate,1) from dual;
NEXT_DAY(
--------- //下一个周一是什么日期。
04-MAR-12
SQL> select order#,orderdate,next_day(orderdate,2) "Should Shipdate"
2 from orders
3 where order#=1010;
ORDER# ORDERDATE Should Sh
---------- --------- --------- //订货以后下周周二必须发货。
1010 03-APR-09 06-APR-09
LAST_DAY总是返回一个月的最后一天。
SQL> select last_day(sysdate) from dual;
LAST_DAY(
---------
29-FEB-12 //查看本月的最后一天是什么日期。可见2012年还是闰年。
SQL> select order#,orderdate,last_day(orderdate)
2 from orders
3 where order# in (1002,1003);
ORDER# ORDERDATE LAST_DAY(
---------- --------- ---------
1002 31-MAR-09 31-MAR-09
1003 01-APR-09 30-APR-09
很多人在输入日期的时候,不适应oracle的默认的日期形式DD-MON-YY.oracle中的TO_DATE函数。可以让运用程序开发员,指定符合用户输入习惯或者组织规范的日期格式。
TO_DATE('d', 'f')d表示输入的日期,f表示指示oracle识别的日期格式。两个时间参数都是字符串,要用单引号括起来。
常用的日期格式有
MONTH:完整的月份拼写,如果不足9个字符用空格补齐,比如APRIL.
MON:3个字符的月份缩写,APR。
MM:2个数值表示的月份,比如 02.
RM:罗马字符代表的月份,比如 IV。
D:数值表示的星期几,4(周四).
DD:数值表示的一个月中的某一天,27(一个月中的第28天).
DDD:数值表示的一年中的某一天,300(一年中的第300天).
DAY:星期几,如果不足9个字符用空格补齐,比如 WEDNESDAY.
DY:3个字符的星期几的缩写,WED。
YYYY:4个数值表示的年份,比如2012.
B.C. OR A.D.:表示是公元前还是公元,比如2012 A.D.
SQL> create table testdate (tdate date);
Table created.
SQL> insert into testdate values('01-MAR-12');
1 row created.
SQL> insert into testdate values('2012-03-01');
insert into testdate values('2012-03-01')
*
ERROR at line 1:
ORA-01861: literal does not match format string
不使用to_date函数就要按照oracle默认的日期格式来输入。
SQL> insert into testdate values(to_date('2012-03-01','yyyy-mm-dd'));
1 row created. //输入的日期格式不是默认的DD-MON-YY。
SQL> commit;
Commit complete.
SQL> select * from testdate;
TDATE
---------
01-MAR-12
01-MAR-12
使用to_date函数的时候,oracle还是按照他默认的日期格式来显示输出。但是输入就不是默认的了。如果要插入的日期格式是ANSI 格式的日期 YYYY-MM-DD,可以使用date关键字.
SQL> insert into testdate values(date '2012-03-01');
1 row created.
round函数在日期函数中的运用,ROUND(d, u)。d代表的是日期数据,u表示四舍五入的单位(月份或者年份)。对于月份如果超过或者等于16号,计数到下一个月的1号。对于年份,如果超过或者等7月16号,计数到下一年的1月1号。
SQL> delete from testdate;
3 rows deleted.
插入下面的4条记录。
insert into testdate values(date '2012-03-16');
insert into testdate values(date '2012-03-06');
insert into testdate values(date '2012-06-16');
insert into testdate values(date '2012-07-16');
SQL> select round(tdate,'year') from testdate;
ROUND(TDA
---------
01-JAN-12
01-JAN-12
01-JAN-12
01-JAN-13
对于年份的舍入,如果没有超过7月16号,都被转换成了日期对应年份的1月1号。
SQL> select round(tdate,'month') from testdate;
ROUND(TDA
---------
01-APR-12
01-MAR-12
01-JUL-12
01-AUG-12
对应月份的舍入,如果没有超过该月的16号,都被转换成了该月的1号。
SQL> select * from testdate;
TDATE
---------
16-MAR-12
06-MAR-12
16-JUN-12
16-JUL-12
当然表中实际存储的数据是没有被改动的。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26110315/viewspace-717183/
,如需转载,请注明出处,否则将追究法律责任。