如何計算實際工作天(假日扣除) |
答題得分者是:st33chen
|
lovemari
中階會員 ![]() ![]() ![]() 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
|
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
如果除了星期六, 星期天外皆為工作天的話 用一個 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 發送簡訊給我 |
大大 我懂你意思
那我建立一各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 發送簡訊給我 |
您好 假設 同一個 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
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
我剛剛試過不用 STORED FUNCTIONS 的兩個方法, 都可以 看起來最後一種方法比較精簡, 和您的方法也比較像, 忘掉第一種方法吧, (我在寫第一方法時可能腦筋沒有轉得很好吧 ^_^) 參考一下
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-18 10:10:20, 註解 無‧
|
lovemari
中階會員 ![]() ![]() ![]() 發表:134 回覆:224 積分:76 註冊:2005-08-18 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |