在线等,如何求两个日期之间有多少个星期天?1. 如果求两个日期之间间隔多少天,可以把这两个日期之间相减,就可以了.2. 如果要求两个日期之间有多少个星期天,怎么搞,目前我采用的方法是:
把两个日期之间的每一天都拿出来作判断:
如果这天是星期天就累加 1 , 就像下面的程式, 但是这种做法速度太慢了. 请问各位大哥,有没有更好方法求
两个日期之间有多少个星期天啊?资料库版本为 Oracle 9I while v_date_s <= v_date_e loop
select to_char(v_date_s , 'D')
into v_day
from dual ;
if v_day <> 1 then
v_total := v_total + 1 ;
end if;
v_date_s := v_date_s + 1 ;
end loop ;
把两个日期之间的每一天都拿出来作判断:
如果这天是星期天就累加 1 , 就像下面的程式, 但是这种做法速度太慢了. 请问各位大哥,有没有更好方法求
两个日期之间有多少个星期天啊?资料库版本为 Oracle 9I while v_date_s <= v_date_e loop
select to_char(v_date_s , 'D')
into v_day
from dual ;
if v_day <> 1 then
v_total := v_total + 1 ;
end if;
v_date_s := v_date_s + 1 ;
end loop ;
select to_char(v_date_s , 'D')
into v_day
from dual ;
if v_day = 1 then
v_total := v_total + 1 ;
v_date_s := v_date_s + 7 ;
else
v_date_s := v_date_s + 1 ;
end if;
end loop ;
/*日期,to_char(日期, 'd') ,to_char(日期,'DAY'),*/sum(decode(to_char(日期, 'd'),1,1,0))
from (select to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) 日期
from user_objects
where rownum < 367
and to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) <
to_date('2009-01-01', 'yyyy-mm-dd'));
select
日期,to_char(日期, 'd') ,to_char(日期,'DAY')
from (select to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) 日期
from user_objects
where rownum < 367
and to_date('2008-01-01', 'yyyy-mm-dd') + (rownum - 1) <
to_date('2009-01-01', 'yyyy-mm-dd')) where to_char(日期, 'd')=1;
select to_char(v_date_s , 'D')
into v_day
from dual ;
if v_day = 1 then
exit;
else
v_date_s := v_date_s + 1 ;
end if;
end loop ; v_total :=(v_date_e - v_date_s)/7;
from (select rownum rn from all_objects
where rownum <= to_date('20080427','yyyymmdd') - to_date('20080421','yyyymmdd')+1)
where to_char(to_date('20080421','yyyymmdd')+rn-1,'D') in ('1');
比如说是同年
SELECT TO_CHAR (SYSDATE, 'iw') - TO_CHAR (SYSDATE - 60, 'iw'),
TO_CHAR (SYSDATE, 'iw'), TO_CHAR (SYSDATE - 60, 'iw')
FROM DUAL
我这是统计当前日到60天前有几周(也相当于有几个星期天)
TO_CHAR (SYSDATE, 'yyyy'),
TO_CHAR (SYSDATE + 1200, 'iw') - TO_CHAR (SYSDATE, 'iw'),
52
- TO_CHAR (SYSDATE, 'iw')
+ 52
* ( TO_CHAR (SYSDATE + 1200, 'yyyy')
- TO_CHAR (SYSDATE, 'yyyy')
)
+ TO_CHAR (SYSDATE + 1200, 'iw')
) sun_num,
TO_CHAR (SYSDATE + 1200, 'iw') end_week, TO_CHAR (SYSDATE, 'iw') start_week,
SYSDATE + 1200 end_day, SYSDATE start_day
FROM DUAL不过这个算法我没仔细验证过,可能在日期上有点小的偏差,总的思路是可用的,你再验证下具体的值对不对
SELECT decode (TO_CHAR (统计结束日, 'yyyy'),
TO_CHAR (统计起始日, 'yyyy'),
TO_CHAR (统计结束日, 'iw') - TO_CHAR (统计起始日, 'iw'),
52
- TO_CHAR (统计起始日, 'iw')
+ 52
* ( TO_CHAR (统计结束日, 'yyyy')
- TO_CHAR (统计起始日, 'yyyy')
)
+ TO_CHAR (统计结束日, 'iw')
) sun_num
FROM DUAL
SELECT decode (TO_CHAR (统计结束日, 'yyyy'),
TO_CHAR (统计起始日, 'yyyy'),
TO_CHAR (统计结束日, 'iw') - TO_CHAR (统计起始日, 'iw'),
52
- TO_CHAR (统计起始日, 'iw')
+ 52
*(( TO_CHAR (统计结束日, 'yyyy')
- TO_CHAR (统计起始日, 'yyyy')
)-1)
+ TO_CHAR (统计结束日, 'iw')
) sun_num
FROM DUAL
思路
decode 统计结束日的年份
条件一 如果和超始日同年,则结束日的周-起始日的周
默认,52-超始日的周+52*(两个日期年份之差-1)+结束日的的周数
(select TO_CHAR(to_date('2008-02-01','yyyy-MM-dd' ) +rownum-1 ,'day') dat
from user_objects
where rownum<=(to_date('2008-03-01','yyyy-MM-dd')-to_date('2008-02-01','yyyy-MM-dd')+1) ) v
where v.dat = '星期日';
这个是查'2008-02-01'到'2008-03-01'有几个星期天的,我试过,没问题的
from user_objects
where rownum <=(to_date('2008-03-01','yyyy-MM-dd')-to_date('2008-02-01','yyyy-MM-dd')+1)这个是求出两个日期中间的一段时间,时间格式'day'类型的,也就是星期几,然后再找出是星期天的,就行了.