Oracle中日期时间函数用法

oracle date 操作

oracle date 操作

Ø  使用oracledate类型时,最好使用24小时制。date类型精确的秒。

Ø  oracle的日期在24小时制中000000 Oracle中表示为叫做上午12点,也就是零点。我们中午12点叫做下午12点。

Ø  世界是这样循环的上午12 -上午1201 -上午1 --上午1159 59 --下午12 - 下午12 02 - 下午1 -下午115959

Ø  关于日期函数 add_months dnlast_dayd),roundd,【fmt】)

add_months dn

add_months 中的d

 1】如果没有时间值,结果为下个月的当前日的开始日期 -000000上午12点。

2】如果有时间值,结果为下月的当前日的时间加时间值。
3】如果d为当前月的最后一天,结果为下个月的最后一天。

例如:

SQL> select sysdate,add_months(sysdate,1) from dual;

 

SYSDATE     ADD_MONTHS(SYSDATE,1)

----------- ---------------------

2013/6/4 13   2013/7/4 13:49:32

SQL> select sysdate,add_months(sysdate,-2) from dual;

 

SYSDATE     ADD_MONTHS(SYSDATE,-2)

----------- ----------------------

2013/6/4 13   2013/4/4 13:50:37

last_day
last_day
当前月的最后一天的0000

例如:

SQL> select sysdate,last_day(sysdate) from dual;

 

SYSDATE     LAST_DAY(SYSDATE)

----------- -----------------

2013/6/4 13  2013/6/30 13:53:2

round()trunc()
round
四舍五入,格式为year ,舍入到11日, month ,舍入到该月第一日,大于16,为下月。day 最近的星期天
trunc
round相似,但不四舍五入。

例如:

SQL> select to_date('2013-6-16','YYYY-MM-DD') d,round(to_date('2013-6-16','YYYY-MM-DD'),'year') year,round(to_date('2013-6-16','YYYY-MM-DD'),'month') month,round(to_date('2013-6-16','YYYY-MM-DD'),'day') day from dual;

 

D           YEAR        MONTH       DAY

----------- ----------- ----------- -----------

2013/6/16   2013/1/1    2013/7/1    2013/6/16

SQL> select sysdate,round(sysdate,'day') from dual;

 

SYSDATE     ROUND(SYSDATE,'DAY')

----------- --------------------

2013/6/4 14 2013/6/2

SQL> select sysdate,trunc(sysdate,'year') year,trunc(sysdate,'month') month,trunc(sysdate,'day') day from dual;

 

SYSDATE     YEAR        MONTH       DAY

----------- ----------- ----------- -----------

2013/6/4 13 2013/1/1    2013/6/1    2013/6/2

extract()

extract (fmt from d)
       fmt
可取为 year, month, day , hour, minute ,second .

例如:

SQL> select sysdate,extract(year from sysdate) y,extract(month from sysdate) m,extract(day from sysdate) d from dual;

 

SYSDATE              Y          M          D

----------- ---------- ---------- ----------

2013/6/4 17       2013          6          4

总结:oracle的日期函数默认操作日期,既不包括时间。如果有时间的话就加上时间,但不做处理。默认都是day

Oracle关于时间/日期的操作
1.日期时间间隔操作
  当前时间减去7分钟的时间
select sysdate,sysdate - interval ’7’ MINUTE from dual

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate-interval '7' minute from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-INTERVAL'7'MINUTE

------------------------------ -------------------------

2013/06/04 17:19:27            2013/6/4 17:12:27
当前时间减去7小时的时间
select sysdate - interval ’7’ hour from dual

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate-interval '2' hour from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-INTERVAL'2'HOUR

------------------------------ -----------------------

2013/06/04 17:20:09            2013/6/4 15:20:09
当前时间减去7天的时间
select sysdate - interval ’7’ day from dual

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate-interval '2' day from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-INTERVAL'2'DAY

------------------------------ ----------------------

2013/06/04 17:21:33            2013/6/2 17:21:33
 当前时间减去7月的时间
select sysdate,sysdate - interval ’7’ month from dual

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate-interval '2' month from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-INTERVAL'2'MONTH

------------------------------ ------------------------

2013/06/04 17:22:23            2013/4/4 17:22:23
当前时间减去7年的时间
select sysdate,sysdate - interval ’7’ year from dual

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate-interval '2' year from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-INTERVAL'2'YEAR

------------------------------ -----------------------

2013/06/04 17:22:50            2011/6/4 17:22:50
时间间隔乘以一个数字
select sysdate,sysdate - 8 *interval ’2’ hour from dual

SQL>  select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate - 8 *interval '2' hour from dual;

 

SQL> select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS'),sysdate - 2 *interval '2' hour from dual;

 

TO_CHAR(SYSDATE,'YYYY/MM/DDHH2 SYSDATE-2*INTERVAL'2'HOUR

------------------------------ -------------------------

2013/06/04 17:26:19            2013/6/4 13:26:19
2.日期到字符操作
select sysdate,to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm-dd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-ddd hh:mi:ss’) from dual
select sysdate,to_char(sysdate,’yyyy-mm iw-d hh:mi:ss’) from dual
  参考oracle的相关关文档(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515)
3. 字符到日期操作
select to_date(’2003-10-17 21:15:37’,’yyyy-mm-dd hh24:mi:ss’) from dual
  具体用法和上面的to_char差不多。
4. trunk/ ROUND函数的使用
select trunc(sysdate ,’YEAR’) from dual
select trunc(sysdate ) from dual

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

 

SYSDATE     TRUNC(SYSDATE)

----------- --------------

2013/6/4 17 2013/6/4
select to_char(trunc(sysdate ,’YYYY’),’YYYY’) from dual
5.oracle有毫秒级的数据类型
--返回当前时间年月日小时分秒毫秒
select to_char(current_timestamp(5),’DD-MON-YYYY HH24:MI:SSxFF’) from dual;

SQL> select to_char(current_timestamp(2),'DD-MON-YYYY HH24:MI:SSxFF') a, to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') b from dual;

 

A                                   B

----------------------------------- ------------------

04-6 -2013 17:31:37.26            04-6 -2013 17:31:37.25700
--返回当前时间的秒毫秒,可以指定秒后面的精度(最大=9)
select to_char(current_timestamp(9),’MI:SSxFF’) from dual;

SQL> select to_char(current_timestamp(9),'MI:SSxFF') from dual;

 

TO_CHAR(CURRENT_TIMESTAMP(9),'

------------------------------

30:31.221000000
6.计算程序运行的时间(ms)
declare
type rc is ref cursor;
l_rc rc;
l_dummy all_objects.object_name%type;
l_start number default dbms_utility.get_time;
begin
for I in 1 .. 1000
loop
open l_rc for
’select object_name from all_objects ’||
’where object_id = ’ || i;
fetch l_rc into l_dummy;
close l_rc;
end loop;
dbms_output.put_line
( round( (dbms_utility.get_time-l_start)/100, 2 ) ||
’ seconds...’ );
end;

7.取得当前日期是本月的第几周

SQL> select sysdate,to_char(sysdate,'YYYYMMDD   W   HH24:MI:SS')   from   dual;

 

SYSDATE     TO_CHAR(SYSDATE,'YYYYMMDDWHH24

----------- ------------------------------

2013/6/4 17 20130604   1   17:34:13

SQL> select sysdate,to_char(sysdate,'W')   from   dual;  

 

SYSDATE     TO_CHAR(SYSDATE,'W')

----------- --------------------

2013/6/4 17 1

8.取得当前日期是一个星期中的第几天,注意星期日是第一天

SQL> select sysdate,to_char(sysdate,'D') from dual;  

 

SYSDATE     TO_CHAR(SYSDATE,'D')

----------- --------------------

2013/6/4 17 3

类似:

select   to_char(sysdate,'yyyy')   from   dual;   --  

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

 

SYSDATE     TO_CHAR(SYSDATE,'YYYY')

----------- -----------------------

2013/6/4 17 2013
  select   to_char(sysdate,'Q')   from   dual;           --
  

SQL> select sysdate,to_char(sysdate,'Q') from dual; 

 

SYSDATE     TO_CHAR(SYSDATE,'Q')

----------- --------------------

2013/6/4 17 2
  select   to_char(sysdate,'mm')   from   dual;       --
  

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

 

SYSDATE     TO_CHAR(SYSDATE,'MM')

----------- ---------------------

2013/6/4 17 06
  select   to_char(sysdate,'dd')   from   dual;       --
  

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

 

SYSDATE     TO_CHAR(SYSDATE,'DD')

----------- ---------------------

2013/6/4 17 04

 ddd   年中的第几天  
  WW  
年中的第几个星期  
  W     
该月中第几个星期  
  D     
周中的星期几  
  hh  
小时(12)  
  hh24  
小时(24)  
  Mi  
  
  ss  

SQL> select sysdate,to_char(sysdate,'WW'),to_char(sysdate,'ddd') from dual;

 

SYSDATE     TO_CHAR(SYSDATE,'WW') TO_CHAR(SYSDATE,'DDD')

----------- --------------------- ----------------------

2013/6/4 17   23                    155

9:取当前日期是星期几中文显示:

SQL> select sysdate,to_char(sysdate,'day') from dual;

 

SYSDATE     TO_CHAR(SYSDATE,'DAY')

----------- ----------------------

2013/6/4 17 星期二

10.如果一个表在一个date类型的字段上面建立了索引,如何使用

alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'


11.得到当前的日期
SQL> select sysdate from dual;

 

SYSDATE

-----------

2013/6/4 17

12.得到当天凌晨000秒的日期
SQL> select sysdate,trunc(sysdate) from dual;

 

SYSDATE     TRUNC(SYSDATE)

----------- --------------

2013/6/4 17 2013/6/4

13.得到这天的最后一秒
SQL> select sysdate,trunc(sysdate) + 0.99999 from dual;

 

SYSDATE     TRUNC(SYSDATE)+0.99999

----------- ----------------------

2013/6/4 17 2013/6/4 23:59:59

14.得到小时的具体数值
select trunc(sysdate) + 1/24 from dual;

SQL> select sysdate,trunc(sysdate) + 1/24 from dual;

 

SYSDATE     TRUNC(SYSDATE)+1/24

----------- -------------------

2013/6/4 17 2013/6/4 1:00:00

select trunc(sysdate) + 7/24 from dual;

SQL> select sysdate,trunc(sysdate) + 7/24 from dual;

 

SYSDATE     TRUNC(SYSDATE)+7/24

----------- -------------------

2013/6/4 17 2013/6/4 7:00:00

15.得到明天凌晨000秒的日期

select trunc(sysdate+1) from dual;

SQL> select sysdate,trunc(sysdate+1) from dual;

 

SYSDATE     TRUNC(SYSDATE+1)

----------- ----------------

2013/6/4 17 2013/6/5
16.本月一日的日期
select trunc(sysdate,'mm') from dual;

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

 

SYSDATE     TRUNC(SYSDATE,'MM')

----------- -------------------

2013/6/4 17 2013/6/1
17.得到下月一日的日期
select trunc(add_months(sysdate,1),'mm') from dual;

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

 

SYSDATE     TRUNC(ADD_MONTHS(SYSDATE,1),'M

----------- ------------------------------

2013/6/4 17 2013/7/1

18.返回当前月的最后一天?
select last_day(sysdate)  from dual;       

SQL> select sysdate,last_day(sysdate) from dual;

 

SYSDATE     LAST_DAY(SYSDATE)

----------- -----------------

2013/6/8 9: 2013/6/30 9:55:09
select last_day(trunc(sysdate))  from dual; 

SQL> select trunc(sysdate),last_day(trunc(sysdate)) from dual;

 

TRUNC(SYSDATE) LAST_DAY(TRUNC(SYSDATE))

-------------- ------------------------

2013/6/8       2013/6/30
select trunc(last_day(sysdate))  from dual;

SQL> select trunc(sysdate),trunc(last_day(sysdate)) from dual;

 

TRUNC(SYSDATE) TRUNC(LAST_DAY(SYSDATE))

-------------- ------------------------

2013/6/8       2013/6/30
select trunc(add_months(sysdate,1),'mm') - 1 from dual;

SQL> select sysdate,add_months(sysdate,1) a,trunc(add_months(sysdate,1),'mm') b,trunc(add_months(sysdate,1),'mm')-1 c from dual;

 

SYSDATE     A           B           C

----------- ----------- ----------- -----------

2013/6/8 9: 2013/7/8 9: 2013/7/1    2013/6/30
19.得到一年的每一天
SQL> select trunc(sysdate,'yyyy')+ rn -1 date0

      from

     (select rownum rn from all_objects

      where rownum<366);
20.今天是今年的第N
SQL> SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;

 

TO_CHAR(SYSDATE,'DDD')

----------------------

159

21.如何在给现有的日期加上2
SQL> select sysdate,add_months(sysdate,24) from dual;

 

SYSDATE     ADD_MONTHS(SYSDATE,24)

----------- ----------------------

2013/6/8 10 2015/6/8 10:05:45

22:判断某一日子所在年分是否为润年
select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','
闰年','平年') from dual;

SQL> select sysdate,decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from dual;

 

SYSDATE     DECODE(TO_CHAR(LAST_DAY(TRUNC(

----------- ------------------------------

2013/6/8 10 平年

23:判断两年后是否为润年
select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','
闰年','平年') from dual;

SQL> select trunc(sysdate),decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年') from dual;

 

TRUNC(SYSDATE) DECODE(TO_CHAR(LAST_DAY(TRUNC(

-------------- ------------------------------

2013/6/8       平年
24.得到日期的季度

select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;

SQL> select trunc(sysdate) a,ceil(to_number(to_char(sysdate,'mm'))/3) b from dual;

 

A                    B

----------- ----------

2013/6/8             2

select to_char(sysdate, 'Q') from dual;

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

 

TRUNC(SYSDATE) TO_CHAR(SYSDATE,'Q')

-------------- --------------------

2013/6/8       2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值