Oracle时间计算

Oracle时间计算

核心提示:日期格式参数 含义说明 D一周中的星期几 DAY天的名字,使用空格填充到9个字符 DD 月中的第几天 DDD年中的第几天 DY天的简写名 IW ISO标准的年中的第几周 IYYYISO

日期格式参数   含义说明

一周中的星期几

DAY    天的名字,使用空格填充到9个字符

DD   月中的第几天

DDD  年中的第几天

DY  天的简写名

IW   ISO标准的年中的第几周

IYYY  ISO标准的四位年份

YYYY  四位年份

YYY,YY,Y  年份的最后三位,两位,一位

HH  小时,按12小时计

HH24  小时,按24小时计

MI 

SS 

MM 

Mon   月份的简写

Month   月份的全名

该月的第几个星期

WW  年中的第几个星期

 

1.日期时间间隔操作

    当前时间减去7分钟的时间

         select sysdate,sysdate - interval ’7’ MINUTE from dual  

    当前时间减去7小时的时间

        select sysdate - interval ’7’ hour from dual    

    当前时间减去7天的时间

        select sysdate - interval ’7’ day from dual

    当前时间减去7月的时间

        select sysdate,sysdate - interval ’7’ month from dual 

    当前时间减去7年的时间

        select sysdate,sysdate - interval ’7’ year from dual

    时间间隔乘以一个数字

        select sysdate,sysdate - 8 *interval ’2’ hour from dual

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-dhh: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 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; --返回当前 时间的秒毫秒,可以指定秒后面的精度(最大=9) select to_char(current_timestamp(9),MI:SSxFF) from dual;

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;

24小时的形式显示出来要用HH24

    select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分钟

    select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm会显示月份

add_months(d,n) 日期dn个月

last_day(d) 包含d的月?的最后一天的日期

new_time(d,a,b) a的日期和db的日期和

next_day(d,day) 比日期d,由day指定的周几的日期

sysdate 当前的系日期和

greatest(d1,d2,...dn) 出的日期列表中最后的日期

least(d1,k2,...dn) ?出的日期列表中最早的日期

to_char(d [,fmt]) 日期dfmt指定的格式??成字符串

to_date(st [,fmt]) 字符串stfmt指定的格式?成日期,若fmt忽略,st要用缺省格式

round(d [,fmt]) 日期dfmt

指定格式舍入到最近的日期

trunc(d [,fmt]) 日期dfmt指定格式截断到最近的日期

to_date 字符串类型转为换日期类型

字符串中的相应位置上的字符,必须符合时间范围的限制

查询Oracle日期格式

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

select * from nls_database_parameters;

得到结果如下表: 表中NLS_DATE_FORMAT表示日期格式.

PARAMETER VALUE

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

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS .,

NLS_CHARACTERSET ZHS16GBK

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT DD-MON-RR

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY

NLS_TIME_FORMAT HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM

NLS_DUAL_CURRENCY $

NLS_COMP BINARY

NLS_NCHAR_CHARACTERSET ZHS16GBK

NLS_RDBMS_VERSION 8.1.7.0.0

或者查询V$NLS_PARAMETERS,

select * from V$NLS_PARAMETERS;

也有类似结果

SQL>select to_date('2004-11-12 12-07-32','yyyy-mm-dd hh24-mi-ss') value from dual;

VALUE

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

2004.11.12 12:07:32

SQL>select to_date('20041015') value from dual;

VALUE

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

2004.10.15 00:00:00

SQL>select to_date('20041315') value from dual;

ERROR 位于第 1 :

ORA-01861: 文字与格式字符串不匹配

sysdate 当前日期和时间

SQL>select sysdate value from dual;

VALUE

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

2003.11.23 17:09:01

last_day 本月最后一天

SQL>select last_day(sysdate) value from dual;

VALUE

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

2003.11.30 17:08:17

add_months(d,n) 日期d后推n个月

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

VALUE

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

2005.01.23 17:10:21

next_day(d,day) 日期d之后的第一周中,指定的那天(指定星期的第几天)是什么日期

SQL>select next_day(sysdate,1) value from dual;

VALUE

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

2004.11.28 17:38:55

 

 

[oracle/plsql]oracle日期处理完全版

日期处理完全版

TO_DATE格式

Day:

dd number 12

dy abbreviated fri

day spelled out friday

ddspth spelled out, ordinal twelfth

Month:

mm number 03

mon abbreviated mar

month spelled out march

Year:

yy two digits 98

yyyy four digits 1998

24小时格式下时间范围为: 0:00:00 - 23:59:59....

12小时格式下时间范围为: 1:00:00 - 12:59:59 ....

1.

日期和字符转换函数用法(to_date,to_char

2.

select to_char( to_date(222,'J'),'Jsp') from dual

显示Two Hundred Twenty-Two

3.

求某天是星期几

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;

星期一

Select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from

dual;

monday

设置日期语言

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';

也可以这样

TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')

4.

两个日期间的天数

select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;

5. 时间为null的用法

select id, active_date from table1

UNION

select 1, TO_DATE(null) from dual;

注意要用TO_DATE(null)

6.

a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')

那么1231号中午12点之后和121号的12点之前是不包含在这个范围之内的。

所以,当时间需要精确的时候,觉得to_char还是必要的

7. 日期格式冲突问题

输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

alter system set NLS_DATE_LANGUAGE = American

alter session set NLS_DATE_LANGUAGE = American

或者在to_date中写

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;

注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,

可查看

select * from nls_session_parameters

select * from V$NLS_PARAMETERS

8.

select count(*) from ( select rownum-1 rnum from all_objects where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002- 02-01','yyyy-mm-dd')+1 ) where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' ) not in ( '1', '7' )

查找2002-02-282002-02-01间除星期一和七的天数

在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100, 而不是毫秒).

9.

select months_between(to_date('01-31-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

1

select months_between(to_date('02-01-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;

1.03225806451613

10. Next_day的用法

Next_day(date, day)

Monday-Sunday, for format code DAY

Mon-Sun, for format code DY

1-7, for format code D

11

select to_char(sysdate,'hh:mi:ss') TIME from all_objects

注意:第一条记录的TIME 与最后一行是一样的

可以建立一个函数来处理这个问题

create or replace function sys_date return date is

begin

return sysdate;

end;

select to_char(sys_date,'hh:mi:ss') from all_objects;

12.获得小时数

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer

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

SYSDATE TO_CHAR(SYSDATE,'HH')

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

2003-10-13 19:35:21 07

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

SYSDATE TO_CHAR(SYSDATE,'HH24')

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

2003-10-13 19:35:21 19

获取年月日与此类似

13. 年月日的处理

select older_date, newer_date, years, months, abs( trunc( newer_date- add_months( older_date,years*12+months ) ) ) days from ( select trunc(months_between( newer_date, older_date )/12) YEARS, mod(trunc(months_between( newer_date, older_date )), 12 ) MONTHS, newer_date, older_date from ( select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date from emp ) )

14. 处理月份天数不定的办法

select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

15. 找出今年的天数

select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

16 闰年的处理方法

to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' )

如果是28就不是闰年

17. yyyyrrrr的区别

'YYYY99 TO_C

------- ----

yyyy 99 0099

rrrr 99 1999

yyyy 01 0001

rrrr 01 2001

18.不同时区的处理

select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate

from dual;

19. 5秒钟一个间隔

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS') from dual

2002-11-1 9:55:00 35786

SSSSS表示5位秒数

20. 一年的第几天

select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

310 2002-11-6 10:03:51

21.计算小时,,,毫秒

Select Days, A, TRUNC(A*24) Hours, TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes, TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds, TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds from ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual )

select * from tabname order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值