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) dd
from 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') newdate2
from dual;

NEWDATE1

NEWDATE2

2010-2-13

2010-2-12 上午 01:00:00