Oracle中常用的函数——时间类型函数

1. 日期的处理(RR 与 yyyy)
默认情况下,在英国和美国的设备中的日期格式为RR制:DD-MON-RR

设置变量nls_date_format可以改变日期格式,如:
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd HH24:mi:ss';

RR制 与 yyyy制 的转换

                        指定日期
                00 - 49            50 - 99
当    
前    00 - 49        本世纪            上世纪
    
日    50 - 99        下世纪            本世纪
期    

例:若当前为2020年,27-DEC-20转换为yyyy制,表示2020年12月27日
                    27-DEC-98转换为yyyy制,表示1998年12月27日
                    
    若当前为1995年,27-DEC-20转换为yyyy制,表示2020年12月27日,不是1920年12月27日
                    27-DEC-98转换为yyyy制,表示1998年12月27日

SELECT TO_CHAR(TO_DATE('27-12月-98' , 'DD-MON-RR') , 'yyyy-mm-dd') FROM dual;

TO_CHAR(TO_DATE('27-12月-98' , 'DD-MON-RR') , 'yyyy-mm-dd')
------------
1998-12-27

SELECT TO_CHAR(TO_DATE('27-12月-20' , 'DD-MON-RR') , 'yyyy-mm-dd') FROM dual;

TO_CHAR(TO_DATE('27-12月-20' , 'DD-MON-RR') , 'yyyy-mm-dd')
------------
2020-12-27


2. SYSDATE 从用户会话返回当前的日期时间
例:
SQL> SELECT SYSDATE FROM dual;

SYSDATE
-------------------
2020-12-27 01:50:19

3. CURRENT_DATE 从用户会话返回当前日期时间
例:
SQL> SELECT SESSIONTIMEZONE AS USERTIMEZONE , CURRENT_DATE FROM dual;

USERTIMEZONE
---------------------------------------------------------------------------
CURRENT_DATE
-------------------
+08:00
2020-12-27 02:01:42


4. CURRENT_TIMESTAMP 从用户会话返回当前日期时间和时区
例:
SQL> SELECT SESSIONTIMEZONE AS USERTIMEZONE , CURRENT_TIMESTAMP FROM dual;

USERTIMEZONE
---------------------------------------------------------------------------
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
+08:00
27-DEC-20 02.02.21.945544 AM +08:00

5. 日期的计算
对日期使用算术运算符:

例:
SQL> SELECT
    emp.EMPLOYEE_ID , emp.FIRST_NAME , emp.LAST_NAME , TO_CHAR(emp.HIRE_DATE,'yyyy-mm-dd') ,TO_CHAR(CURRENT_DATE,'yyyy-mm-dd') ,
    ROUND((CURRENT_DATE - emp.HIRE_DATE)/365) AS EMPLOYED_YEAR
FROM employees emp OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

EMPLOYEE_ID FIRST_NAME         LAST_NAME           HIRE_DATE    CURRENT_DATE        EMPLOYED_YEAR    
----------- -------------------- ------------------------- ------------------- -------------------
    105 David         Austin            2005-06-25 00:00:00    2020-12-27 02:27:09           16
    106 Valli         Pataballa           2006-02-05 00:00:00    2020-12-27 02:27:09           15
    107 Diana         Lorentz           2007-02-07 00:00:00    2020-12-27 02:27:09           14
    108 Nancy         Greenberg           2002-08-17 00:00:00    2020-12-27 02:27:09           18
    109 Daniel         Faviet            2002-08-16 00:00:00    2020-12-27 02:27:09           18


6. 日期处理函数
(1) MONTHS_BETWEEN(d1 , d2):计算两个日期之间的月数差值
注意:MONTHS_BETWEEN(d1 , d2) 函数不会自动取整

例:
SQL> SELECT MONTHS_BETWEEN(TO_DATE('01-SEP-05' , 'DD-MON-RR') , TO_DATE('11-JAN-04' , 'DD-MON-RR')) FROM dual;

MONTHS_BETWEEN(TO_DATE('01-SEP-05','DD-MON-RR'),TO_DATE('11-JAN-04','DD-MON-RR')
--------------------------------------------------------------------------------
                                      19.6774194

(2) ADD_MONTHS(d , n): 返回日期d加上n个月以后的日期
说明:d和n都是必须的,d为日期,n为数值
例:
SQL> SELECT ADD_MONTHS(TO_DATE('03-SEP-05' , 'DD-MON-RR') , 2) FROM dual;

ADD_MONTHS(TO_DATE('03-SEP-05' , 'DD-MON-RR') , 2)
-------------------
2005-11-03 00:00:00

(3)NEXT_DAY(d , c): 返回日期d之后的c代表的一天第一次出现的日期
说明:d和c都是必须的,d为日期,c为一周中某一天的文本应用
例:返回2021-11-15(星期一)的之后的第一个周一
SQL> SELECT TO_CHAR(NEXT_DAY(TO_DATE('2021-11-15','yyyy-mm-dd'),'MONDAY'),'yyyy-mm-dd') "Next_Monday" FROM dual;

Next_Monday
-------------------
2021-11-22

(4) LAST_DAY(d): 返回日期d所属的月份的最后一天
例:
SQL> SELECT TO_CHAR(SYSDATE , 'yyyy-mm-dd') , TO_CHAR(LAST_DAY(SYSDATE) , 'yyyy-mm-dd') FROM dual;

TO_CHAR(SYSDATE , 'yyyy-mm-dd')     TO_CHAR(LAST_DAY(SYSDATE) , 'yyyy-mm-dd')
-------------------------------     ---------------------------------------
2020-12-27                          2020-12-31

(5) ROUND(d , 'MONTH') / ROUND(d , 'YEAR'):对 日期d 按照月/年进行四舍五入
说明:
对日期类型按月四舍五入时,如果小于等于15号,则返回当月1号零点零分;如果大于等于16号,则返回下月1日零点零分
对日期类型按年四舍五入时,如果小于等于6月30日,则返回当年1月1日的零点零分;如果大于等于7月1日,则返回下一年1月1日的零点零分
例:
SQL> SELECT ROUND(TO_DATE('2020-12-15 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH') FROM dual;

ROUND(TO_DATE('2020-12-15 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH')
----------------------------------------------------------------------------
2020-12-01 00:00:00


SQL> SELECT ROUND(TO_DATE('2020-12-16 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH') FROM dual;

ROUND(TO_DATE('2020-12-16 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH')
----------------------------------------------------------------------------
2021-01-01 00:00:00


SQL> SELECT ROUND(TO_DATE('2020-06-30 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR') FROM dual;

ROUND(TO_DATE('2020-06-30 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR')
----------------------------------------------------------------------------
2020-01-01 00:00:00


SQL> SELECT ROUND(TO_DATE('2020-07-01 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR') FROM dual;

ROUND(TO_DATE('2020-07-01 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR')
-------------------
2021-01-01 00:00:00

(6) TRUNC(d,'MONTH') / TRUNC(d,'YEAR'): 对日期d按照年月进行截断
例:
SQL> SELECT TRUNC(TO_DATE('2020-06-30 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH') FROM dual;

TRUNC(TO_DATE('2020-06-30 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'MONTH')
----------------------------------------------------------------------------
2020-06-01 00:00:00


SQL> SELECT TRUNC(TO_DATE('2020-12-27 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR') FROM dual;

TRUNC(TO_DATE('2020-12-27 03:23:16' , 'yyyy-mm-dd hh24:mi:ss') , 'YEAR')
----------------------------------------------------------------------------
2020-01-01 00:00:00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值