Oracle中日期时间的处理有时候是非常让人头疼的一件事。下面呢,我将我总结的一些日期时间函数的用法写下来,以作化输出为输入之用。
先来了解些基本概念:
日期时间函数:用于处理DATE和TIMESTAMP类型的数据,除了函数MONRHS_BETWEEN返回数字值外,其他日期函数均返回DATE类型的数据。
数字格式:Oracle是以7位数字格式来存放日期数据的,包括世纪、年、月、日、小时、分钟、秒,并且默认日期显示格式为“DD-MON-YY”。下面主要对日期时间函数做以总结(说明:以下示例都在sqlplus中书写,并测试通过的):1、ADD_MONTHS(d,n) 返回d之后或之前的n个月所对应的日期时间(n为正整数表示之后,n为负整数表示之前)。示例如下:SQL>DECLARE v_date DATE; BEGIN v_date:=add_months(sysdate,-14); dbms_output.put_line('当前日期前14个月对应的日期:'||v_date); END;当前日期前14个月对应的日期:27-10月-022、CURRENT_DATE 返回当前会话时区对应的日期时间,示例如下:SQL>ALTER session SET TIME_ZONE='-5:0';SQL>ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI';SQL>SELECT current_date FROM dual;结果为:CURRENT_DATE--------------------------2003-12-27 06:443、CURRENT_TIMESTAMP 用于返回当前会话时区的日期时间。示例如下:SQL>SELECT current_timestamp FROM dual;CURRENT_TIMESTAMP---------------------------------27-12月-03 07.45.22.146000 下午 +08:004、DBTIMEZONE 用于返回数据库所在时区,示例如下:SQL>DECLARE v_zone VARCHAR2(10); BEGIN v_zone:=dbtimezone; dbms_output.put_line('当前数据库时区:'||v_zone); END;结果:当前数据库时区:+08:005、EXTRACT 用于从日期时间值中取得所需要的特定数据(例如取得年份、月份等)SQL>SELECT extract(YEAR FROM sysdate) year FROM dual;YEAR------------20176、FROM_TZ 用于将特定时区的TIMESTAMP值转变为TIMESTAMP WITH TIME ZONE值,示例如下:SQL>DECLARE v_tzv VARCHAR2(100); BEGIN v_tzv:=from_tz(TIMESTAMP '2003-03-28 08:00:00','3:00'); dbms_output.put_line(v_tzv); END;28-3月 -03 08.00.00.000000000 上午 +03:007、LAST_DAY(d) 用于返回特定日期所在月份的最后一天。示例如下:SQL>SELECT last_day(sysdate) FROM dual;LAST_DAY(sysdate)----------------------------31-12月-038、LOCALTIMESTAMP 用于返回当前会话时区的日期时间。SQL>DECLARE v_ts VARCHAR2(100); BEGIN v_ts:=localtimestamp; dbms_output.put_line('当前日期时间:'||v_ts); END;当前日期时间:27-12月-03 08.25.08.607000000 下午9、MONTHS_BETWEEN(d1,d2) 用于返回日期d1和d2之间相差的月数。如果d1小于d2,则返回负数。如果日期d1和d2的天数相同或都是月底,则返回整数;否则Oracle以每月31天为准来计算结果的小数部分。SQL> SELECT months_between(sysdate,'31-8月 -1998') FROM dual;MONTHS_BETWEEN(SYSDATE,'31-8 月-1998')-------------------------------------------------------------------63.89842910、NEW_TIME(date,zone1,zone2) 用于返回时区一的日期时间所对应的时区二的日期时间。SQL>DECLARE v_time DATE; BEGIN dbms_session.set_nls('nls_date_format','YYYY-MM-DD HH24:MI:SS'); v_time:=new_time(to_date('2003-11-10 12:10:00','YYYY-MM-DD HH24:MI:SS'),'BST','EST'); dbms_output.put_line('当前日期时间:'||v_time); END;当前日期时间:2003-11-10 18:10:0011、NEXT_DAY(d,char) 该函数用于返回指定日期后的第一个工作日(由char指定)所对应的日期。示例如下:SQL>SELECT next_day(sysdate,'星期一') AS nextday FROM dual;nextday-----------29-12月 -0312、ROUND(d[.fmt]) 用于返回日期时间的四舍五入结果。如果fmt指定年度,则7月1日为分界线;如果fmt指定月,则16日为分界线;如果指定天,则中午12:00时为分界线SQL>DECLARE v_date DATE; BEGIN v_date:=ROUND(SYSDATE,'MONTH'); dbms_output.put_line(SYSDATE||'四舍五入结果:'||v_date); END;28-12月-03 四舍五入结果:01-1月 -0413、SESSIONTIMEZONE 返回当前会话所在时区SQL>SELECT sessiontimezone FROM dual;SESSIONTIMEZONE---------------------------------+08:0014、SYSDATE 用于返回当前系统的日期时间SQL>SELECT sysdate FROM dual;SYSDATE ----------------28-12月 -0315、SYSTIMESTAMP 用于返回当前系统的日期时间及时区。示例如下SQL>DECLARE v_timestamp VARCHAR2(100); BEGIN v_timestamp:=SYSTIMESTAMP; dbms_output.put_line('当前系统时间及时区:'||v_timestamp); END;当前系统时间及时区:28-12月-03 07.46.47.745000000 上午 +08:00注意:以上为一些常用的日期时间函数。:
新闻热点
疑难解答