数据库——Oracle中常见的日期类型及日期函数

来源:互联网 发布:淘宝上买的轮毂可靠吗 编辑:程序博客网 时间:2024/06/06 00:02

1、常用日期型数据类型

DATE
这是ORACLE最常用的日期类型,它可以保存日期和时间,常用日期处理都可以采用这种类型。DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日
date类型在数据库中的存储固定为7个字节,格式为:
第1字节:世纪+100
第2字节:年
第3字节:月
第4字节:天
第5字节:小时+1
第6字节:分+1
第7字节:秒+1

TIMESTAMP(p)
这也是ORACLE常用的日期类型,它与date的区别是不仅可以保存日期和时间,还能保存小数秒,小数位数可以指定为0-9,默认为6位,所以最高精度可以到ns(纳秒),数据库内部用7或者11个字节存储,如果精度为0,则用7字节存储,与date类型功能相同,如果精度大于0则用11字节存储。
格式为:
第1字节:世纪+100
第2字节:年
第3字节:月
第4字节:天
第5字节:小时+1
第6字节:分+1
第7字节:秒+1
第8-11字节:纳秒,采用4个字节存储,内部运算类型为整形

注:TIMESTAMP日期类型如果与数值进行加减运算会自动转换为DATE型,也就是说小数秒会自动去除。

2、常见问题

如何取当前时间
sysdate–返回当前系统日期和时间,精确到秒
systimestamp–返回当前系统日期和时间,精确到毫秒
如何进行日期运算
日期型数据可以与数值加减得到新的日期,加减数值单位为天
sysdate+1–取明天的当前时间
sysdate-1/24–取当前时间的前一个小时

select sysdate aa,sysdate+5 bb,sysdate+5/24 cc,sysdate-3 dd from dual;
AA BB CC DD 2017/9/23 星期六 0:24:55 2017/9/28 星期四 0:24:55 2017/9/23 星期六 5:24:55 2017/9/20 星期三 0:24:55


如何求两个日期的间隔时间
可以直接把两个日期相减,返回的单位为天,小时及分秒会换算成小数

select date'2017-10-23'-sysdate 时间差 from dual;
时间差 29.9770717592593


如何将日期转字符
to_char(sysdate,’YYYY-MM-DD HH24:MI:SS’)
如何将字符转日期
to_date(‘2010-02-24 15:01:54’,’YYYY-MM-DD HH24:MI:SS’)
to_timestamp(‘1999-12-01 11:00:00.123456’,’YYYY-MM-DD HH:MI:SS.FF6’)

3、常用日期函数

TO_CHAR(DATE,FORMATSTR)–格式化日期成字符
to_char的其他用法:

SELECT TO_CHAR(date '2010-02-12', 'D') week_dayth,--周第几天(1-7),星期天=1,以此类推TO_CHAR(date '2010-02-12', 'DD') month_dayth,--月第几天TO_CHAR(date '2010-02-12', 'DDD') year_dayth,--年第几天TO_CHAR(date '2010-02-12', 'DAY') weekdayname,--英文星期名_CHAR(date '2010-02-12', 'w') month_weekth,--月第几周(0-4)TO_CHAR(date '2010-02-12', 'ww') year_weekth--年第几周(0-53)FROM DUAL;
WEEK_DAYTH MONTH_DAYTH YEAR_DAYTH WEEKDAYNAME MONTH_WEEKTH YEAR_WEEKTH 6 12 043 星期五 2 07


TO_DATE(CHAR,FORMATSTR) –将字符转换成日期
to_date(‘2010-02-24 15:01:54’,’YYYY-MM-DD HH24:MI:SS’)
格式备注:HH表示12小时制,HH24为24小时制,MM表月份,MI表分钟

TRUNC(DATE)–返回DATE的日期部分,时间为0点0分0秒

select sysdate 原始,trunc(sysdate) 后来 from dual;
原始 后来 2017/9/23 星期六 0:59:50 2017/9/23 星期六


EXTRACT(DATA FROM DATEVALUE)–返回DATE的某一部份内容
如果DATEVALUE为DATE类型,则DATA可以是(YEAR、MONTH、DAY)
如果DATEVALUE为TIMESTAMP类型,则DATA可以是(YEAR、MONTH,DAY、HOUR、MINUTE、SECOND)

select sysdate 原始,EXTRACT(YEAR FROM sysdate) 年份,EXTRACT(MINUTE FROM systimestamp) 分钟 from dual;
原始 年份 分钟 2017/9/23 星期六 1:08:35 2017 8


ADD_MONTHS(DATE,MONTHS) –在DATE增加月份得到新日期
ADD_MONTHS(sysdate,3) –当前日期加3个月
ADD_MONTHS是一个比较有意思的函数,它会自动处理大小月及闰月,如下所示

select    ADD_MONTHS(date '2010-2-12', 1) aa,   ADD_MONTHS(date '2010-2-27', 1) bb,   ADD_MONTHS(date '2010-2-28', 1) cc,   ADD_MONTHS(date '2010-1-31', 1) ddfrom dual;
AA BB CC DD 2010/3/12 星期五 2010/3/27 星期六 2010/3/31 星期三 2010/2/28 星期日


LAST_DAY(DATE)–返回日期所在月份的最后一天日期

select LAST_DAY(date '2010-2-12') 最后一天 from dual;
最后一天 2010-2-28


NEXT_DAY(DATE,CHAR) –从给定日期开始返回下一个星期几(由char指定)的日期
char可以是中文的星期一~星期日,或英文的Monday~Sunday,还可以是1~7的数字(1表星期日,以此类推)

注:当char为英文时,需切换语言环境(这里的alter session设置的是当前会话的参数,退出即失效)代码如下:alter session set nls_date_language=American; --修改成功alter session set nls_date_language='SIMPLIFIED CHINESE'; --修改回中文
select next_day(date'2017-9-24',6) 下周五 from dual;
下周五 2017/9/29 星期五


TO_YMINTERVAL(CHAR)–返回[年-月]格式构成的时间间隔
一般用于日期加减运算

select date'2010-2-12'+TO_YMINTERVAL('01-02') newdate from dual;
NEWDATE 2011-4-12


TO_DSINTERVAL(CHAR)–返回[天 时:分:秒]格式构成的时间间隔
一般用于日期加减运算

select date'2017-06-23'+to_dsinterval('1 01:56:23') 天时分秒 from dual;
天时分秒 2017/6/24 星期六 1:56:23


NUMTOYMINTERVAL(N,CHAR) –返回CHAR中指定单位的时间间隔数值
一般用于日期加减运算,char可以为YEAR,MONTH

select date '2010-2-12' + NUMTOYMINTERVAL(1, 'year') newdate1,date '2010-2-12' + NUMTOYMINTERVAL(1, 'month') newdate2 from dual;
NEWDATE1 NEWDATE2 2011-2-12 2010-3-12


NUMTODSINTERVAL(N,CHAR) –返回CHAR中指定单位的时间间隔数值
一般用于日期加减运算,char可以为DAY,HOUR,MINUTE,SECOND

select date '2010-2-12' + NUMTODSINTERVAL(1, 'DAY') newdate1,date '2010-2-12' + NUMTODSINTERVAL(1, 'HOUR') newdate2from dual;
NEWDATE1 NEWDATE2 2010-2-13 2010-2-12 上午 01:00:00