Oracle常用日期函数

以下大部分转载于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

猜你喜欢

转载自luckystar2008.iteye.com/blog/1908700