怎么在oracle中,計算出任意日期之間的工作日天數(shù)
創(chuàng)新互聯(lián)公司,專注為中小企業(yè)提供官網(wǎng)建設、營銷型網(wǎng)站制作、響應式網(wǎng)站設計、展示型成都網(wǎng)站設計、做網(wǎng)站等服務,幫助中小企業(yè)通過網(wǎng)站體現(xiàn)價值、有效益。幫助企業(yè)快速建站、解決網(wǎng)站建設與網(wǎng)站營銷推廣問題。
=NETWORKDAYS(A10,B10),
A10起始日期,B10結束日期,這個只能計算雙休.
~~~
1、獲取當天是禮拜幾:selectto_char(sysdate,'d')fromdual;--禮拜天為1,禮拜一為2,類推
2、獲取 兩個時間段間的 工作日:
select(trunc(end_dt - start_dt) -
((case
WHEN(8- to_number(to_char(start_dt,'D'))) trunc(end_dt - start_dt) +1THEN0
ELSE
? ? ? trunc((trunc(end_dt - start_dt) -
(8- to_number(to_char(start_dt,'D'))))/7) +1END) +
(case
WHENmod(8- to_char(start_dt,'D'),7) trunc(end_dt - start_dt) -1THEN0
ELSE
trunc((trunc(end_dt - start_dt) - (mod(8- to_char(start_dt,'D'),7) +1))/7) +1END)))
asworkingdays
fromdual
下面的sql可以直接運行:
select(trunc(to_date('2010-11-11','yyyy-mm-dd') -to_date('2010-11-07','yyyy-mm-dd')) -
((case
WHEN(8- to_number(to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'))) trunc(to_date('2010-11-11','yyyy-mm-dd') -to_date('2010-11-07','yyyy-mm-dd')) +1THEN0
ELSE
trunc((trunc(to_date('2010-11-11','yyyy-mm-dd') -to_date('2010-11-07','yyyy-mm-dd')) -
(8- to_number(to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'))))/7) +1END) +
(case
WHENmod(8- to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'),7) trunc(to_date('2010-11-11','yyyy-mm-dd') -to_date('2010-11-07','yyyy-mm-dd')) -1THEN0
ELSE
trunc((trunc(to_date('2010-11-11','yyyy-mm-dd') -to_date('2010-11-07','yyyy-mm-dd')) - (mod(8- to_char(to_date('2010-11-07','yyyy-mm-dd'),'D'),7) +1))/7) +1END)))
asworkingdays
fromdual
~~~
select count(id),sum(case when day='星期一' or day='星期二' or day='星期三' or day='星期四' or day='星期五' then 1 else 0 end) 工作日,sum(case when day='星期六' or day='星期日' then 1 else 0 end) 周末 from table
另外:我發(fā)現(xiàn)你的表中有重復值啊,這個怎么算,不管么?還是要去重?這張表(我說的是例子)似乎有點問題。
還應該由其他寫法,暫時就想起這一種來。
思路:20個工作日是4個周的工作日 加上4*2個休息日 20+4*2一共是28天,將2012-9-29日之后的28天列出來,查找第20個工作日
關于計算這個28其實沒有必要,因為這是最小范圍,取任意大于28的范圍都可以
select * from
(
with x as (
select trunc(to_date('2012-9-28','yyyy-mm-dd')+level,'dd') +level-1 day ,to_char(to_date('2012-9-28','yyyy-mm-dd')+level,'dy') weekday from dual
connect by level = 28
)select rownum id,x.* from x where weekday not in ('星期六','星期日')
)y where id = 20