線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2185
推到 Plurk!
推到 Facebook!

如何計算實際工作天(假日扣除)

答題得分者是:st33chen
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-14 16:01:28 IP:122.116.xxx.xxx 訂閱
小弟寫了某段程式碼內容約為

OUT_TIME - IN_TIME = TIME < '14'

那想實現 14天 是為工作天 (扣除星期六 星期天)

想請教各位大大該如何去做?
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-14 18:23:58 IP:122.116.xxx.xxx 未訂閱
您好,

如果除了星期六, 星期天外皆為工作天的話

用一個 for loop 去判斷指定期間內的每一天是否為非 sunday, 非 saturday

否則 ( 有時 monday 到 friday 有可能是非工作天, 而 saturday 到 sunday 有可能是工作天 )

用一個 table ( 欄位假設為 dt, workday) 每天都要有一筆, 且 workday 填 Y 或 N
然後 用 query
select count(*) from table where dt between in_time and out_time and workday='Y'

您試試看



===================引 用 lovemari 文 章===================
小弟寫了某段程式碼內容約為

OUT_TIME - IN_TIME = TIME < '14'

那想實現 14天 是為工作天 (扣除星期六 星期天)

想請教各位大大該如何去做?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-17 16:50:04 IP:122.116.xxx.xxx 訂閱
大大 我懂你意思

那我建立一各TABLE 裡面寫了1-365天

每天的日期各紀錄一次

格式 20081017 Y
20081018 N
20081019 N
20081020 Y

等等

然後我在我原本TALBE 做關聯是用日期

TO_CHAR(UPDATE_TIME,'YYYYMMDD') = 我建立的TABLE 日期

然後程式我就寫 COUNT (DATE) 並且下條件 要Y 才算

可跑出來結果都是每列都顯示 1


[code delphi]
SELECT A.SN,A.IN_TIME,B.OUT_TIME,
(B.OUT_TIME - A.IN_TIME) "TIME",COUNT(C.DATE) "TIME2" //這邊算兩次是為了要比較有算假日跟沒算假日的差別
FROM TABLE A,TABLE B,TABLE C
WHERE TO_CHAR(A.IN_TIME,'YYYYMMDD') = C.DATE //作TABLE A各日期的關連
AND TO_CHAR(B.OUT_TIME,'YYYYMMDD') = C.DATE //作TABLE B各日期的關連
AND C.STATUS = 'Y'


結果跑出來都是 // x 是 B.OUT_TIME - A.IN_TIME
SN1 IN_TIME OUT_TIME x 1
SN2 IN_TIME OUT_TIME x 1
SN3 IN_TIME OUT_TIME x 1


[/code]

都是1 耶= =
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-10-17 16:59:12, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-17 17:27:29 IP:122.116.xxx.xxx 未訂閱
您好

假設 同一個 SN 有 IN_TIME 就一定有 OUT_TIME, 有 OUT_TIME 就一定有 IN_TIME
如果這個假設不成立, 這些方法可能會有問題
如果是我自己做, 我會做一個 STORED FUNCTION ( 名為 CALC_WORKDAYS, 內容類似select count(*) from table where dt between in_time and out_time and workday='Y')

然後
SELECT A.SN, A.IN_TIME, B.OUT_TIME, CALC_WORKDAYS(A.IN_TIME, B.OUT_TIME) WORKING_DAYS
FROM TABLE_IN A, TABLE_OUT B
WHERE A.SN=B.SN;

如果不用 STORED FUNCTION, 那請試一下
SELECT A.SN, MIN(A.DT) IN_TIME, MAX(B.DT) OUT_TIME, COUNT(*) WORKING_DAYS
FROM (
SELECT A.SN, C.DT
FROM TABLE_IN A, TABLE_CALENDAR C
WHERE C.DT>=A.IN_TIME
AND C.STATUS='Y'
) A, (
SELECT B.SN, C.DT
FROM TABLE_OUT B, TABLE_CALENDAR C
WHERE C.DT<=B.OUT_TIME
AND C.STATUS='Y'
) B
WHERE A.SN=B.SN
AND A.DT=B.DT
GROUP BY A.SN;

我還沒測, 先憑想像寫出 SQL, 請您先測一下, 我有空也會測

另外一個方法好像也可以

select A.SN, min(A.IN_TIME) IN_TIME, max(B.OUT_TIME) OUT_TIME, count(DT) WORKING_DAYS
from table_in A, table_out B, table_calendar C
where A.SN=B.SN
and C.DT between A.IN_TIME and B.OUT_TIME
and C.STATUS='Y'
group by A.SN
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-17 17:31:06, 註解 無‧
st33chen 重新編輯於 2008-10-17 17:53:07, 註解 無‧
st33chen 重新編輯於 2008-10-18 09:16:53, 註解 無‧
st33chen 重新編輯於 2008-10-18 09:57:45, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-18 09:54:34 IP:122.116.xxx.xxx 未訂閱
您好,
我剛剛試過不用 STORED FUNCTIONS 的兩個方法, 都可以
看起來最後一種方法比較精簡, 和您的方法也比較像,
忘掉第一種方法吧, (我在寫第一方法時可能腦筋沒有轉得很好吧 ^_^)
參考一下
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-18 10:10:20, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-20 11:23:34 IP:122.116.xxx.xxx 訂閱
謝謝大大的指教

我剛剛還有想到一各最最最簡單的方法了

但是這各方法適用在 "假日不上班"的情況下

就是我把TABLE的所有六日 以及國定假日

全部刪除

然後再把所有工作天做一各排序 1,2,3,4,.....

我只要用排序去做相減 就是工作天了

剛剛實際操作之後真的可以了...^_^


不過還是很謝謝大大教我不少其他的方法呢

謝謝呢
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
系統時間:2024-05-08 9:18:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!