ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 日期函數

日期函數

原创 Linux操作系统 作者:javens 时间:2008-08-01 16:41:05 0 删除 编辑

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') 
那么12月31号中午12点之后和12月1号的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-28至2002-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 

16. 
找出今年的天数
 
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 

闰年的处理方法
 
to_char( last_day( to_date('02' || :year,'mmyyyy') ), 'dd' ) 
如果是28就不是闰年
 

17. 
yyyy
与rrrr的区别
 
'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'); 

// 
floor((date2-date1) /365) 
作为年
 
floor((date2-date1, 365) /30) 
作为月
 
mod(mod(date2-date1, 365), 30)
作为日
. 
23.next_day
函数
 
next_day(sysdate,6)
是从当前开始下一个星期五。后面的数字是从星期日开始算起。
 
1 2 3 4 5 6 7 
日 一 二 三 四 五 六 

 

An alternative to this method is to use the numtodsinterval function. The example above can instead be written like this:

SQL> SELECT to_char(sysdate + numtodsinterval(2, ‘HOUR’), ‘HH:MI AM’) FROM dual;

TO_CHAR(
——–
11:57 AM

Here the numtodsinterval function is doing the work of dividing 2/24 for hours. Valid options for the numtodsinterval are ‘DAY’, ‘HOUR’, ‘MINUTE’, or ‘SECOND’. Here is an example using ‘MINUTE’. When working with minutes the numtodsinterval function is much more readable.

SQL> SELECT to_char(sysdate + numtodsinterval(45, ‘MINUTE’), ‘HH:MI AM’) FROM dual;

TO_CHAR(
——–
10:47 AM

Adjusting Months and Years

To work with months and years (either of which may have a varying number of days) Oracle has provided the function numtoyminterval. This works much like the numtodsinterval function mentioned above by taking a number and a string. Valid options for the string are ‘YEAR’ or ‘MONTH’.

SQL> SELECT to_char(sysdate + numtoyminterval(5, ‘MONTH’), ‘MM/DD/YYYY’) FROM dual;

TO_CHAR(SY
———-
04/29/2006

SQL> SELECT to_char(sysdate + numtoyminterval(2, ‘YEAR’), ‘MM/DD/YYYY’) FROM dual;

TO_CHAR(SY
———-
11/29/2007

 每年的一號怎麼取
SQL> select trunc(sysdate,'yyyy') from dual;
 
TRUNC(SYSDATE,'YYYY')
---------------------
2008/01/01
 每月的一號怎麼取
SQL> select trunc(sysdate,'month') from dual;
 
TRUNC(SYSDATE,'MONTH')
----------------------
2008/08/01

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/87010/viewspace-417451/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-15

  • 博文量
    46
  • 访问量
    89196