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 |