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月-02
2、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:44
3、CURRENT_TIMESTAMP 用于返回当前会话时区的日期时间。示例如下:
SQL>SELECT current_timestamp FROM dual;
CURRENT_TIMESTAMP
---------------------------------
27-12月-03 07.45.22.146000 下午 +08:00
4、DBTIMEZONE 用于返回数据库所在时区,示例如下:
SQL>DECLARE
v_zone VARCHAR2(10);
BEGIN
v_zone:=dbtimezone;
dbms_output.put_line('当前数据库时区:'||v_zone);
END;
结果:当前数据库时区:+08:00
5、EXTRACT 用于从日期时间值中取得所需要的特定数据(例如取得年份、月份等)
SQL>SELECT extract(YEAR FROM sysdate) year FROM dual;
YEAR
------------
2017
6、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:00
7、LAST_DAY(d) 用于返回特定日期所在月份的最后一天。示例如下:
SQL>SELECT last_day(sysdate) FROM dual;
LAST_DAY(sysdate)
----------------------------
31-12月-03
8、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.898429
10、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:00
11、NEXT_DAY(d,char) 该函数用于返回指定日期后的第一个工作日(由char指定)所对应的日期。示例如下:
SQL>SELECT next_day(sysdate,'星期一') AS nextday FROM dual;
nextday
-----------
29-12月 -03
12、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月 -04
13、SESSIONTIMEZONE 返回当前会话所在时区
SQL>SELECT sessiontimezone FROM dual;
SESSIONTIMEZONE
---------------------------------
+08:00
14、SYSDATE 用于返回当前系统的日期时间
SQL>SELECT sysdate FROM dual;
SYSDATE
----------------
28-12月 -03
15、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
注意:以上为一些常用的日期时间函数。
: