上篇简单的介绍了一下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,这就是它们两个的区别。
今天写的只不过是简单的例子,希望大家多多指教,欢迎指出不足之处。