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>select sysdate form dual;

SYSDATE

2013/4/2 17:30:44

systimestamp--返回当前系统日期和时间,精确到毫秒;

Sql>select systimestamp from dual;

SYSTIMESTAMP

02-4月 -13 05.31.13.691112 下午 +08:00

2.2、如何进行日期运算

日期型数据可以与数值加减得到新的日期,加减数值单位为天
sysdate+1--取明天的当前时间
sysdate-1/24--取当前时间的前一个小时

SQL> select sysdate d1,sysdate+1 d2,sysdate-1/24 d3 from dual;
D1                       D2                       D3
------------------------ ------------------------ ------------------------
2010-5-13 下午 10:55:16  2010-5-14 下午 10:55:16  2010-5-13 下午 09:55:16

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

SQL> select date'2012-01-01'-sysdate from dual;
 
DATE'2012-01-01'-SYSDATE
------------------------
        597.046030092593

2.4、如何将日期转字符
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')


2.5、如何将字符转日期
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、 常用日期函数

3.1、TO_CHAR(DATE,FORMATSTR)--格式化日期成字符

SQL> select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') d1 from dual;
D1
------------------------
2010-05-13 22:56:38
TO_CHAR的其它用法示例

1 SQL> SELECT TO_CHAR(date '2010-02-12', 'D') week_dayth,--周第几天(1-7),星期天=1,星期一=2,星期二=3,星期三=4,星期四=5,星期五=6,星期六=7
2 TO_CHAR(date '2010-02-12', 'DD') month_dayth,--月第几天
3 TO_CHAR(date '2010-02-12', 'DDD') year_dayth,--年第几天
4 TO_CHAR(date '2010-02-12', 'DAY') weekdayname,--英文星期名
5 _CHAR(date '2010-02-12', 'w') month_weekth,--月第几周(0-4)
6 TO_CHAR(date '2010-02-12', 'ww') year_weekth--年第几周(0-53)
7 FROM DUAL;
WEEK_DAYTH MONTH_DAYTH YEAR_DAYTH WEEKDAYNAME MONTH_WEEKTH YEAR_WEEKTH
---------- ----------- ---------- ----------- ------------ -----------
6          12          043        FRIDAY      2            07
3.2、TO_DATE(CHAR,FORMATSTR) --将字符转换成日期
to_date('2010-02-24 15:01:54','YYYY-MM-DD HH24:MI:SS')
格式备注:
HH表示12小时进制,HH24表示采用24小时进制,MM表示月份,MI表示分钟。

3.3、TRUNC(DATE)--返回DATE的日期部分,时间为0点0分0秒
SQL> select sysdate d1,trunc(sysdate) d2 from dual;
D1                       D2
------------------------ ------------------------
2010-5-13 下午 10:59:18  2010-5-13

SQL> select trunc(sysdate,'yyyy') from dual;

TRUNC(SYSDATE,'YYYY')

2013/1/1

SQL> select trunc(sysdate,'mm') from dual;

TRUNC(SYSDATE,'MM')

2013/4/1

SQL> select trunc(sysdate,'dd') from dual;

TRUNC(SYSDATE,'DD')

2013/4/2

SQL> select trunc(sysdate,'hh') from dual;

TRUNC(SYSDATE,'HH')

2013/4/2 17:00:00

SQL> select trunc(sysdate,'mi') from dual;

TRUNC(SYSDATE,'MI')

2013/4/2 17:37:00

Ps:从年到分,取哪个值其前面的也会计算出来。如计算小时,前面的年月日都计算出来了。

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

select extract(year from sysdate) year,

       extract(month from sysdate) month,

       extract(day from sysdate) day,

       extract(year from systimestamp) yearoftimestamp,

       extract(month from systimestamp) monthoftimestamp,

       extract(day from systimestamp) dayoftimestmp,

       extract(hour from systimestamp) houroftimestamp,

       extract(minute from systimestamp) minuteoftimestamp,

       extract(second from systimestamp) secondoftimestamp,

       extract(hour from timestamp'2013-04-02 16:56:55') customeTimeStamp

  from dual;

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增加月份得到新日期

--获取当前日期的下个月日期

select add_months(sysdate,1) from dual;

--获取当前日期的上个月日期

select add_months(sysdate,-1) from dual;

--add_months()函数会自动处理大小月及闰月

--比如下面的这个,3.31是3月的最后1天,加上8个月后是11月30,这是11月的最后1天。

select add_months(date'2013-03-31',8) from dual;

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

SQL> select LAST_DAY(date '2010-2-12') from dual;
LAST_DAY(DATE'2010-2-12')
-------------------------
2010-2-28

3.7、NEXT_DAY(DATE,CHAR) --从给定日期开始返回下个CHAR指定星期的日期

SQL> SELECT NEXT_DAY(date'2010-2-21', 'MONDAY') NEXTDAY1,NEXT_DAY(date'2010-2-22', 'MONDAY') NEXTDAY2 FROM DUAL;
NEXTDAY1    NEXTDAY2
----------- -----------
2010-2-22   2010-3-1
TO_YMINTERVAL(CHAR)--返回[年-月]格式构成的时间间隔,一般用于日期加减运算

3.8、TO_DSINTERVAL(CHAR)--返回[天 时:分:秒]格式构成的时间间隔,一般用于日期加减运算
SQL> select date'2010-2-12'+TO_YMINTERVAL('01-02') newdate from dual;
NEWDATE
------------------------------
2011-4-12

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

--下面返回:2012/3/28,2013/2/28

select date'2012-2-28' + numtoyminterval(1,'month') month,date'2012-2-28' + numtoyminterval(1,'year') year from dual;

--这个函数有一个问题:比如上面我将日期改成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

from dual;

NOW DAY HOUR MINUTE SECOND

1 2012/2/29 2012/3/1 2012/2/29 1:00:00 2012/2/29 0:01:00 2012/2/29 0:00:01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值