以下大部分转载于www.cnblogs.com/linximf/archive。
1、常用日期型数据类型
1.1、DATE
这是ORACLE最常用的日期类型,它可以保存日期和时间,常用日期处理都可以采用这种类型。DATE表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日
date类型在数据库中的存储固定为7个字节,格式为:
第1字节:世纪+100
第2字节:年
第3字节:月
第4字节:天
第5字节:小时+1
第6字节:分+1
第7字节:秒+1
1.2、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、常见问题
2.1、如何取当前时间
sysdate--返回当前系统日期和时间,精确到秒
Sql>selectsysdateformdual;
SYSDATE
2013/4/217:30:44
systimestamp--返回当前系统日期和时间,精确到毫秒;
Sql>selectsystimestampfromdual;
SYSTIMESTAMP
02-4月-1305.31.13.691112下午+08:00
2.2、如何进行日期运算
日期型数据可以与数值加减得到新的日期,加减数值单位为天
sysdate+1--取明天的当前时间
sysdate-1/24--取当前时间的前一个小时
SQL>selectsysdated1,sysdate+1d2,sysdate-1/24d3fromdual;
D1D2D3
------------------------------------------------------------------------
2010-5-13下午10:55:162010-5-14下午10:55:162010-5-13下午09:55:16
2.3、如何求两个日期的间隔时间
可以直接把两个日期相减,返回的单位为天,小时及分秒会换算成小数
SQL>selectdate'2012-01-01'-sysdatefromdual;
DATE'2012-01-01'-SYSDATE
------------------------
597.046030092593
2.4、如何将日期转字符
to_char(sysdate,'YYYY-MM-DDHH24:MI:SS')
2.5、如何将字符转日期
to_date('2010-02-2415:01:54','YYYY-MM-DDHH24:MI:SS')
to_timestamp('1999-12-0111:00:00.123456','YYYY-MM-DDHH:MI:SS.FF6')
3、常用日期函数
3.1、TO_CHAR(DATE,FORMATSTR)--格式化日期成字符
SQL>selectto_char(sysdate,'YYYY-MM-DDHH24:MI:SS')d1fromdual;
D1
------------------------
2010-05-1322:56:38
TO_CHAR的其它用法示例
1SQL>SELECTTO_CHAR(date'2010-02-12','D')week_dayth,--周第几天(1-7),星期天=1,星期一=2,星期二=3,星期三=4,星期四=5,星期五=6,星期六=7
2TO_CHAR(date'2010-02-12','DD')month_dayth,--月第几天
3TO_CHAR(date'2010-02-12','DDD')year_dayth,--年第几天
4TO_CHAR(date'2010-02-12','DAY')weekdayname,--英文星期名
5_CHAR(date'2010-02-12','w')month_weekth,--月第几周(0-4)
6TO_CHAR(date'2010-02-12','ww')year_weekth--年第几周(0-53)
7FROMDUAL;
WEEK_DAYTHMONTH_DAYTHYEAR_DAYTHWEEKDAYNAMEMONTH_WEEKTHYEAR_WEEKTH
-----------------------------------------------------------------
612043FRIDAY207
3.2、TO_DATE(CHAR,FORMATSTR)--将字符转换成日期
to_date('2010-02-2415:01:54','YYYY-MM-DDHH24:MI:SS')
格式备注:
HH表示12小时进制,HH24表示采用24小时进制,MM表示月份,MI表示分钟。
3.3、TRUNC(DATE)--返回DATE的日期部分,时间为0点0分0秒
SQL>selectsysdated1,trunc(sysdate)d2fromdual;
D1D2
------------------------------------------------
2010-5-13下午10:59:182010-5-13
SQL>selecttrunc(sysdate,'yyyy')fromdual;
TRUNC(SYSDATE,'YYYY')
2013/1/1
SQL>selecttrunc(sysdate,'mm')fromdual;
TRUNC(SYSDATE,'MM')
2013/4/1
SQL>selecttrunc(sysdate,'dd')fromdual;
TRUNC(SYSDATE,'DD')
2013/4/2
SQL>selecttrunc(sysdate,'hh')fromdual;
TRUNC(SYSDATE,'HH')
2013/4/217:00:00
SQL>selecttrunc(sysdate,'mi')fromdual;
TRUNC(SYSDATE,'MI')
2013/4/217:37:00
Ps:从年到分,取哪个值其前面的也会计算出来。如计算小时,前面的年月日都计算出来了。
3.4、EXTRACT(DATAFROMDATEVALUE)--返回DATE的某一部份内容
如果DATEVALUE为DATE类型,则DATA可以是(YEAR、MONTH、DAY)
如果DATEVALUE为TIMESTAMP类型,则DATA可以是(YEAR、MONTH,DAY、HOUR、MINUTE、SECOND)
selectextract(yearfromsysdate)year,
extract(monthfromsysdate)month,
extract(dayfromsysdate)day,
extract(yearfromsystimestamp)yearoftimestamp,
extract(monthfromsystimestamp)monthoftimestamp,
extract(dayfromsystimestamp)dayoftimestmp,
extract(hourfromsystimestamp)houroftimestamp,
extract(minutefromsystimestamp)minuteoftimestamp,
extract(secondfromsystimestamp)secondoftimestamp,
extract(hourfromtimestamp'2013-04-0216:56:55')customeTimeStamp
fromdual;
YEAR MONTH DAY YEAROFTIMESTAMP MONTHOFTIMESTAMP DAYOFTIMESTMP HOUROFTIMESTAMP MINUTEOFTIMESTAMP SECONDOFTIMESTAMP CUSTOMETIMESTAMP
1 2013 4 2 2013 4 2 9 42 41.195205 16
但是发现HOUR不对。
3.5、ADD_MONTHS(DATE,MONTHS)--在DATE增加月份得到新日期
--获取当前日期的下个月日期
selectadd_months(sysdate,1)fromdual;
--获取当前日期的上个月日期
selectadd_months(sysdate,-1)fromdual;
--add_months()函数会自动处理大小月及闰月
--比如下面的这个,3.31是3月的最后1天,加上8个月后是11月30,这是11月的最后1天。
selectadd_months(date'2013-03-31',8)fromdual;
3.6、LAST_DAY(DATE)--返回日期所在月份的最后一天日期
SQL>selectLAST_DAY(date'2010-2-12')fromdual;
LAST_DAY(DATE'2010-2-12')
-------------------------
2010-2-28
3.7、NEXT_DAY(DATE,CHAR)--从给定日期开始返回下个CHAR指定星期的日期
SQL>SELECTNEXT_DAY(date'2010-2-21','MONDAY')NEXTDAY1,NEXT_DAY(date'2010-2-22','MONDAY')NEXTDAY2FROMDUAL;
NEXTDAY1NEXTDAY2
----------------------
2010-2-222010-3-1
TO_YMINTERVAL(CHAR)--返回[年-月]格式构成的时间间隔,一般用于日期加减运算
3.8、TO_DSINTERVAL(CHAR)--返回[天时:分:秒]格式构成的时间间隔,一般用于日期加减运算
SQL>selectdate'2010-2-12'+TO_YMINTERVAL('01-02')newdatefromdual;
NEWDATE
------------------------------
2011-4-12
3.9、NUMTOYMINTERVAL(N,CHAR)--返回CHAR中指定单位的时间间隔数值,一般用于日期加减运算
char可以为YEAR,MONTH
--下面返回:2012/3/28,2013/2/28
selectdate'2012-2-28'+numtoyminterval(1,'month')month,date'2012-2-28'+numtoyminterval(1,'year')yearfromdual;
--这个函数有一个问题:比如上面我将日期改成2012-2-29,那么加1年后是2013-2-29,但是2013-2月最大是28,这样会报错。
3.10、NUMTODSINTERVAL(N,CHAR)--返回CHAR中指定单位的时间间隔数值,一般用于日期加减运算
char可以为DAY,HOUR,MINUTE,SECOND
--下面加1自动变为2012/3/1
select
date'2012-2-29'now,
date'2012-2-29'+numtodsinterval(1,'day')day,
date'2012-2-29'+numtodsinterval(1,'hour')hour,
date'2012-2-29'+numtodsinterval(1,'minute')minute,
date'2012-2-29'+numtodsinterval(1,'second')second
fromdual;
NOW DAY HOUR MINUTE SECOND
1 2012/2/29 2012/3/1 2012/2/291:00:00 2012/2/290:01:00 2012/2/290:00:01