上篇简单的介绍了一下add_months 函数,本篇博客再介绍下其它的几个日期函数。

可以用下面语句来设置oracle日期的格式

alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

可以查询语句格式

select * from nls_session_parameters where parameter = 'NLS_DATE_FORMAT';

下面首先介绍sysdate 它获取的是服务器端的时间,

sysdate-n  这里的n指的是天

比如

SQL> select sysdate-1 from dual;
 
SYSDATE-1
-----------
2012-2-18 上

这里sysdate-1 就是1天前的时间,如果要1小时以前的则用1/24 可以计算到查询任何时候的。

MONTHS_BETWEEN(date1,date2)

是查两个日期间相差的月数

SQL> select MONTHS_BETWEEN(sysdate,to_date('2012-01-30','yyyy-mm-dd')) from dual;

 
MONTHS_BETWEEN(SYSDATE,TO_DATE
------------------------------
             0.658382243130227

它是查询的两个时间的月数,可以用数表示的。它是第一个时间减去第二个时间

如果 select MONTHS_BETWEEN(to_date('2012-01-30','yyyy-mm-dd'),sysdate) from dual; 时间反过来,查的则是负数的月。

NEXT_DAY(date,6)

下一周的时间,这里6,代表星期5,因为美国日期是从星期天开始的,所以1代表的是星期天,2代表星期一,以此类推。

比如 我找下一个星期二是

SQL> select next_day(sysdate,3) from dual;
 
NEXT_DAY(SYSDATE,3)
-------------------
2012-2-21 上午 09:54:

如果设置了日期格式,可以直接用时间串写

SQL> select next_day('2012-2-19 8:23:12',3) from dual;
 
NEXT_DAY('2012-2-198:23:12',3)
------------------------------
2012-2-21 上午 08:23:12

LAST_DAY  本月的最后一天

SQL> select LAST_DAY(sysdate) from dual;
 
LAST_DAY(SYSDATE)
-----------------
2012-2-29 上午 09:5

它是找的本月的最后一天

SQL> select LAST_DAY('2011-03-12 3:23:12') from dual;
 
LAST_DAY('2011-03-123:23:12')
-----------------------------
2011-3-31 上午 03:23:12

⊙ ROUND(舍入) year,month,dd,day。
⊙ TRUNC(切除)

在日期处理上处理四舍五入的原则分

◎ 一半以下(含一半)舍,如月份,1,2,3,4,5,6月舍弃 
◎ 一半以上入,如月份7,8,9,10,11,12入

举例说明ROUND

SQL> select round(sysdate,'year') from dual;
 
ROUND(SYSDATE,'YEAR')
---------------------
2012-1-1

对年进行截取,因为是2月份,所以舍去

SQL> select round(sysdate,'month') from dual;
 
ROUND(SYSDATE,'MONTH')
----------------------
2012-3-1

这是对月进行截取,因为是19号,属于下半月,就进入下个月。

SQL> select round(sysdate,'dd') from dual;
 
ROUND(SYSDATE,'DD')
-------------------
2012-2-19

dd表示对天进行舍入,现在是早点10点,属于上班段时间。

day是对一周的时间进行舍入,不过它是从礼拜天开始的,比如今天是礼拜日,是第一天

SQL> select round(sysdate,'day') from dual;
 
ROUND(SYSDATE,'DAY')
--------------------
2012-2-19

但是比如昨天是礼拜6,是最后一天,属于后半周。就会入到下周的第一天,也就是礼拜天。s

SQL> select round(to_date('2012-02-18','yyyy-mm-dd'),'day') from dual;
 
ROUND(TO_DATE('2012-02-18','YY
------------------------------
2012-2-19

再介绍一下TRUNC

SQL> select trunc(to_date('2012-02-18','yyyy-mm-dd'),'day') from dual;
 
TRUNC(TO_DATE('2012-02-18','YY
------------------------------
2012-2-12

2月18号是星期六,它就会截取到星期一,所以查出来的是2月12号

年月日就不举例说明,

再介绍两个oracle内置函数

numtoyminterval(1,'month')  month 可以换成year,

NUMTODSINTERVAL(1,'day') day,hour,minute,second

这两个函数的意思是加上你所要的时间,前面一个数量,后面一个是单位。

举个例子,比如说当前时间的2天以后,可以用下列语句

SQL> select sysdate + NUMTODSINTERVAL(2,'day') from dual;
 
SYSDATE+NUMTODSINTERVAL(2,'DAY
------------------------------
2012-2-21 上午 10:33:13

其它都是同样的。

但是在numtoyminterval(1,'month')  这个和add_months 有点区别,比如今天事2月29号,这个月的最后一天,那么再加一个月是3月31号,还是2月29号呢,通过实验来说明

SQL> select add_months(to_date('2012-2-29','yyyy-mm-dd'),1) from dual;
 
ADD_MONTHS(TO_DATE('2012-2-29'
------------------------------
2012-3-31

add_months 是加一个月,这个月的月末到下个月的月末,我们再来看numtoyminterval

SQL>  select to_date('2012-2-29','yyyy-mm-dd')+numtoyminterval(1,'month')  from dual;
 
TO_DATE('2012-2-29','YYYY-MM-D
------------------------------
2012-3-29

它就加到了3月29,这就是它们两个的区别。

今天写的只不过是简单的例子,希望大家多多指教,欢迎指出不足之处。

posted on 2012-02-19 10:40  无尽的缥缈  阅读(666)  评论(2编辑  收藏  举报