《Oracle Database编程指南》13-03:日期时间函数(Datetime Functions)

日期时间函数(Datetime Functions)操作日期(date)、时间戳(timestamp,带有时区的时间戳,以及带有本地时区的时间戳)和interval(从天到秒的时间间隔,从年到月的时间间隔)值。

有些日期时间函数是为Oracle DATE数据类型设计的,比如ADD_MONTHS、CURRENT_DATE、LAST_DAY、NEW_TIME和NEXT_DAY。如果您提供一个时间戳值作为参数,那么Oracle数据库将在内部将输入类型转换为日期值并返回一个日期值。例外情况是MONTHS_BETWEEN函数(它返回一个数字)和ROUND和TRUNC函数(它们根本不接受时间戳或间隔值)。

Oracle 内部使用数字存储日期: 世纪,年,月,日,小时,分钟,秒。
默认的日期格式是 DD-MON-RR。
可以只指定年的后两位在20世纪存放21世纪的日期。
同样可以在21世纪存放20世纪的日期。

日期的数学运算:
在日期上加上或减去一个数字结果仍为日期。
两个日期相减返回日期之间相差的天数。
可以用数字除24来向日期中加上或减去小时。

日期函数如下:

  • ADD_MONTHS
  • CURRENT_DATE
  • CURRENT_TIMESTAMP
  • DBTIMEZONE
  • EXTRACT (datetime)
  • FROM_TZ
  • LAST_DAY
  • LOCALTIMESTAMP
  • MONTHS_BETWEEN
  • NEW_TIME
  • NEXT_DAY
  • NUMTODSINTERVAL
  • NUMTOYMINTERVAL
  • ORA_DST_AFFECTED
  • ORA_DST_CONVERT
  • ORA_DST_ERROR
  • ROUND (date)
  • SESSIONTIMEZONE
  • SYS_EXTRACT_UTC
  • SYSDATE
  • SYSTIMESTAMP
  • TO_CHAR (datetime)
  • TO_DSINTERVAL
  • TO_TIMESTAMP
  • TO_TIMESTAMP_TZ
  • TO_YMINTERVAL
  • TRUNC (date)
  • TZ_OFFSET

/*
主题:日期函数
作者:AT阿宝哥, [email protected]
日期:2016年9月18日
说明:

注意:
    
*/

-------------------------------------------------------------------------------

--查询系统当前日期
SELECT  SYSDATE FROM  Dual;

-------------------------------------------------------------------------------
--日期的数学运算:减法,日期-日期=天数。注意,日期之间不允许相加、相乘和相除。
SELECT  Hiredate , (SYSDATE - Hiredate)  FROM EMP;
SELECT hiredate , (SYSDATE - hiredate) / 7 AS  weeks FROM  emp;
SELECT Hiredate , (SYSDATE - Hiredate) / 365 AS  Years FROM  EMP;

--日期的数学运算:加法,日期+数字=日期。注意,参与运算的数字代表天数,可以用小数。
SELECT SYSDATE  + 7 FROM  dual;
SELECT SYSDATE  - 7 FROM  dual;

SELECT SYSDATE + 36/24 FROM Dual;
SELECT SYSDATE + 1.5 FROM Dual;
-------------------------------------------------------------------------------
--MONTHS_BETWEEN,返回两个日期参数之间月数的数值。
SELECT months_between
       (TO_DATE('02-02-1995','MM-DD-YYYY'),
        TO_DATE('01-01-1995','MM-DD-YYYY') ) FROM  dual;
        
        
SELECT MONTHS_BETWEEN
       (SYSDATE ,
        SYSDATE +31)  from dual;
        
SELECT months_between(SYSDATE , '31-12月-2016')  FROM  dual; --距离年底的月数

-------------------------------------------------------------------------------
--ADD_MONTHS,月数相加返回日期项
select  ADD_MONTHS(sysdate , 2)  from  dual;

-------------------------------------------------------------------------------
--NEXT_DAY,返回指定日期的下一个星期几的日期项
SELECT NEXT_DAY('21-11月-2016', 7)  FROM dual;

SELECT NEXT_DAY('21-11月-2016', 'sun')  FROM dual;
SELECT NEXT_DAY('21-11月-2016', 'tue')  FROM dual;
SELECT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15  FROM  dual;
SELECT  NEXT_DAY('15-OCT-2009','TUESDAY') "NEXT DAY"  FROM  dual;

-------------------------------------------------------------------------------
--LAST_DAY,返回指定日期所属月的最后一天的日期项。
SELECT LAST_DAY(SYSDATE)  FROM dual;
SELECT LAST_DAY(SYSDATE) - SYSDATE FROM dual;
SELECT LAST_DAY(SYSDATE) - SYSDATE "Days Left"  FROM  dual;

-------------------------------------------------------------------------------
--ROUND,按照日期的精度格式对其进行舍入运算
SELECT round(SYSDATE) FROM dual;
SELECT round(SYSDATE , 'CC') FROM dual;--世纪
SELECT round(SYSDATE , 'YYYY') FROM dual;--年
SELECT round(SYSDATE , 'Q') FROM dual;--季度
SELECT round(SYSDATE , 'MM') FROM dual;--月
SELECT round(SYSDATE , 'w') FROM dual;--星期       ???
SELECT round(SYSDATE , 'DD') FROM dual;--天
SELECT round(SYSDATE , 'HH') FROM dual;--小时
SELECT round(SYSDATE , 'MI') FROM dual;--分

-------------------------------------------------------------------------------
--TRUNC,根据指定日期格式对其进行截取
SELECT TRUNC(SYSDATE) FROM dual;--默认格式为日
SELECT TRUNC(SYSDATE+27) FROM dual;--默认格式为日
SELECT TRUNC(SYSDATE+10) FROM dual;--默认格式为日
SELECT TRUNC(SYSDATE+27 , 'w') FROM dual;
SELECT TRUNC(SYSDATE+27 , 'CC') FROM dual;
SELECT TRUNC(SYSDATE+27 , 'YYYY') FROM dual;

-------------------------------------------------------------------------------
--隐式数据类型转换:varchar2和char统称为字符类型,几乎可以存储所有类型的信息
--数字到字符串
SELECT LENGTH(1234567890) FROM dual; 
--日期到字符串
SELECT SYSDATE FROM dual;
SELECT LENGTH(SYSDATE) FROM dual; 

-------------------------------------------------------------------------------
--隐式数据类型转换:字符串到数字,表示数字的字符串必须是有效的数字

--字符串到数字
SELECT mod('11',2) FROM dual; 
SELECT mod('11.123',2) FROM dual;
--字符串到日期
SELECT next_day('20-9月-2016', 7)  FROM dual;

SELECT mod('11.123.123',2) FROM dual; --转换失败
SELECT mod('$11',2) FROM dual;  --转换失败

-------------------------------------------------------------------------------
--隐式数据类型转换:字符串到日期,表示日期的字符串必须是如下格式:[D|DD]分隔符[MON|MONTH]分隔符[R|RR|YY|YYYY],其中,R和RR分别表示1位或者2位数字的年。
--另外,分隔符可以是大多数标点符号、空格和制表符。
SELECT add_months('10-9月-16' , 1)  FROM  dual;--DD-MM月-YY
SELECT add_months('1\9月/16' , 1)  FROM  dual;
SELECT add_months('1/9月/16' , 1)  FROM  dual;
SELECT add_months('1*9月*16' , 1)  FROM  dual;
SELECT add_months('1 9月 16' , 1)  FROM  dual;--空格
SELECT add_months('1$9月$16' , 1)  FROM  dual;--美元符号
-------------------------------------------------------------------------------
--显式数据类型转换:TO_CHAR将数字转换为字符
SELECT TO_CHAR(00001)  FROM dual;--只使用第一个强制参数num
SELECT TO_CHAR(00001,'0999999')  FROM dual;--使用第二个参数format,并使用零
SELECT TO_CHAR(00001,'0999999.00')  FROM dual;--使用小数点的位置
SELECT TO_CHAR(00001,'0999999D00')  FROM dual;--小数分隔符的位置(默认是半角句点)
SELECT TO_CHAR(00001,'0999999,00')  FROM dual;--逗号的位置
SELECT TO_CHAR(00001,'0999999G00')  FROM dual;--组分隔符的位置
SELECT TO_CHAR(00001,'$0999999')  FROM dual;--美元符号
SELECT TO_CHAR(00001,'L0999999')  FROM dual;--当地货币符号
SELECT TO_CHAR(-3040,'999999MI')  FROM dual;--负数的减号位置
SELECT TO_CHAR(-3040,'999999PR')  FROM dual;--包围在括号内的负数
SELECT to_char(3.1415,'99.999EEEE')  FROM dual;--科学计数法
SELECT to_char(100,'99999V99')  FROM dual;--乘以10n次,V后面9的数量表示10的次方
SELECT TO_CHAR(3040,'S999999')  FROM dual;--前面加上+或者-
-------------------------------------------------------------------------------
--显式数据类型转换:TO_CHAR将日期转换为字符
SELECT SYSDATE  ||  ' is a good day! '  FROM  dual;
SELECT TO_CHAR(SYSDATE)  ||  ' is a good day! '  FROM  dual;
SELECT TO_CHAR(SYSDATE , 'yyyy-mm-dd')  FROM  dual;
SELECT TO_CHAR(SYSDATE ,'Y')  FROM  dual;
SELECT TO_CHAR(SYSDATE ,'YY') FROM dual;
SELECT TO_CHAR(SYSDATE ,'YYY') FROM dual;
SELECT TO_CHAR(SYSDATE ,'YYYY') FROM dual;
SELECT TO_CHAR(SYSDATE ,'RR') FROM dual;--两位数字表示的年(已知世纪)
SELECT TO_CHAR(SYSDATE ,'CC') FROM dual;--世纪
SELECT TO_CHAR(SYSDATE ,'Year') FROM dual;
SELECT TO_CHAR(SYSDATE ,'year') FROM dual;
SELECT TO_CHAR(SYSDATE ,'YEAR') FROM dual;
SELECT TO_CHAR(SYSDATE ,'MM') FROM dual;
SELECT TO_CHAR(SYSDATE ,'MON') FROM dual;
SELECT TO_CHAR(SYSDATE ,'Mon') FROM dual;
SELECT TO_CHAR(SYSDATE ,'mon') FROM dual;
SELECT TO_CHAR(SYSDATE ,'MONTH') FROM dual;
SELECT TO_CHAR(SYSDATE ,'Month') FROM dual;
SELECT to_char(SYSDATE ,'month') FROM dual;
SELECT TO_CHAR(SYSDATE ,'D') FROM dual;--本周的第几天
SELECT TO_CHAR(SYSDATE ,'DD') FROM dual;
SELECT TO_CHAR(SYSDATE ,'DDD') FROM dual;--年的日
SELECT to_char(SYSDATE ,'dy') FROM dual;
SELECT TO_CHAR(SYSDATE ,'DY') FROM dual;--星期几
SELECT TO_CHAR(SYSDATE ,'Dy') FROM dual;
SELECT TO_CHAR(SYSDATE ,'day') FROM dual;--区分大小写并用英语表示的星期,但是中文系统中不支持
SELECT TO_CHAR(SYSDATE ,'Day') FROM dual;
SELECT TO_CHAR(SYSDATE ,'DAY') FROM dual;
SELECT TO_CHAR(SYSDATE ,'W') FROM dual;--月的周数
SELECT TO_CHAR(SYSDATE ,'WW') FROM dual;--年的周数
SELECT TO_CHAR(SYSDATE ,'Q') FROM dual;--年的季度数
SELECT TO_CHAR(SYSDATE ,'AM') FROM dual;--子午线指示器
SELECT TO_CHAR(SYSDATE ,'PM') FROM dual;
SELECT TO_CHAR(SYSDATE ,'HH') FROM dual;--小时
SELECT TO_CHAR(SYSDATE ,'MI') FROM dual;--分钟
SELECT TO_CHAR(SYSDATE ,'SS') FROM dual;--秒数
SELECT TO_CHAR(SYSDATE ,'SSSSS') FROM dual;--午夜之后的秒数
-------------------------------------------------------------------------------
--显式数据类型转换:TO_DATE将字符串转换成日期
SELECT TO_DATE('2009', 'YYYY') FROM  dual;
SELECT TO_DATE('8月-2016', 'MON-YYYY') FROM  dual;
SELECT TO_DATE('01-8月-2016', 'DD-MON-YYYY') FROM  dual;
SELECT TO_DATE('01-8月-2016 18:03:45', 'DD-MON-YYYY  HH24:MI:SS') FROM  dual;

-------------------------------------------------------------------------------
--显式数据类型转换:TO_NUMBER将字符串转换成数字
SELECT TO_NUMBER(NULL)  FROM  dual;
SELECT TO_NUMBER('100.00', '9G999D99')  FROM  dual;
SELECT TO_NUMBER('$1,000.55', '$999,999.99')  FROM  dual;
SELECT TO_NUMBER('¥1,000.55', 'L999,999.99')  FROM  dual;

-------------------------------------------------------------------------------

发布了29 篇原创文章 · 获赞 29 · 访问量 4669

猜你喜欢

转载自blog.csdn.net/goldentec/article/details/104763222