感觉

--------------海阔凭跃,天高任
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

日期和時間函數匯總

Posted on 2005-12-26 11:27  感觉  阅读(355)  评论(0)    收藏  举报
1.查询某周的第一天  
select  trunc(decode(ww,  53,  to_date(yy    ¦  ¦  '3112',  'yyyyddmm'),  to_date(yy    ¦  ¦  '-'    ¦  ¦  to_char(ww  *  7),  'yyyy-ddd')),  'd')  last_day  
 from  (select  substr('2004-32',  1,  4)  yy,  to_number(substr('2004-32',  6))  ww  
                 from  dual)  
 
select  trunc(to_date(substr('2003-01',1,5)  ¦  ¦to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')-6  first_day  from  dual  
 
select  min(v_date)  from  
   (select  (to_date('200201','yyyymm')  +  rownum)  v_date  
   from  all_tables  
   where  rownum  <  370)  
where  to_char(v_date,'yyyy-iw')  =  '2002-49'  
 
2.查询某周的最后一天  
select  trunc(decode(ww,  53,  to_date(yy    ¦  ¦  '3112',  'yyyyddmm'),  to_date(yy    ¦  ¦  '-'    ¦  ¦  to_char(ww  *  7),  'yyyy-ddd')),  'd')  -  6  first_day  
   from  (select  substr('2004-33',  1,  4)  yy,  to_number(substr('2004-33',  6))  ww  
                   from  dual)  
                     
select  trunc(to_date(substr('2003-01',1,5)  ¦  ¦to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')  last_day  from  dual  
 
select  max(v_date)  from  
   (select  (to_date('200408','yyyymm')  +  rownum)  v_date  
   from  all_tables  
   where  rownum  <  370)  
where  to_char(v_date,'yyyy-iw')  =  '2004-33'  
 
3.查询某周的日期  
select  min_date,  to_char(min_date,'day')  day  from  
 (select  to_date(substr('2004-33',1,4)  ¦  ¦'001'+rownum-1,'yyyyddd')  min_date    
               from  all_tables  
   where  rownum  <=  decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)      
   union  
   
   select  to_date(substr('2004-33',1,4)-1  ¦  ¦  
                 decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd')  min_date    
               from  all_tables                      
                   where  rownum  <=  7  
   union  
 
   select  to_date(substr('2004-33',1,4)+1  ¦  ¦'001'+rownum-1,'yyyyddd')  min_date    
               from  all_tables                      
                   where  rownum  <=  7                                                
 )  
where  to_char(min_date,'yyyy-iw')  ='2004-33'  
---------------------------------------------------------------  
 
在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')      
那么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      
日  一  二  三  四  五  六  
 
---------------------------------------------------------------  
---------------------------------------------------------------  
 
日期格式化:  
"text"  
 
 Yes  
 Punctuation  and  quoted  text  is  reproduced  in  the  result.  
   
AD  
A.D.  
 
 Yes  
 AD  indicator  with  or  without  periods.  
   
AM  
A.M.  
 
 Yes  
 Meridian  indicator  with  or  without  periods.  
   
BC  
B.C.  
 
 Yes