2014-07-11 71 views
0

我正在嘗試在C shell中編寫一個腳本,用於在過去的8個工作日內從Informix數據庫中選擇數據。 到目前爲止,我有一個計算在過去+星期天和星期六8天SQL代碼,它看起來像這樣:在Informix中計算過去8個工作日內容

select * 
from ekzo 
where datzah = today- 
(case 
     when weekday(today) = 1 then 12 
     when weekday(today) = 2 then 12 
     when weekday(today) = 3 then 12 
     when weekday(today) = 4 then 10 
     when weekday(today) = 5 then 10 
     when weekday(today) = 6 then 10 
     when weekday(today) = 0 then 11 
     end) 

我已經創建表「prazkal」節假日,看起來像這樣:

datpra 01.01.2014 
nazpra Nova Godina 
krapra SRI 

datpra 06.01.2014 
nazpra Bogojavljanje ili Sveta tri kralja 
krapra PON 

datpra 20.04.2014 
nazpra Uskrs 
krapra NED 

datpra 21.04.2014 
nazpra Uskršnji ponedjeljak 
krapra PON 

... 

我不知道如何延長我的sql計算過去8個工作日,考慮週末和假期。

+2

一個共同的方法(無論DBMS)是創建的所有天日曆表,有些被標記爲工作日或非工作日(無論出於何種原因)。然後,您計算(*)表中兩個日期之間的工作天數,這與您僅記錄假期的當前設計不同。 –

+0

另請參見[如何在兩個日期之間獲取Informix中的工作日數](http://stackoverflow.com/questions/29748645/how-to-get-number-of-working-days-in-informix-between-兩個日期/)。 –

+0

Jonathan Leffler可能是較新的帖子。 – Cikson

回答

2

我會做2個功能。一是功能檢查,如果每天都是假日:

create function is_holiday(d datetime year to day) 
returning boolean; 
    -- define hcnt integer; 

    if weekday(d) = 0 or weekday(d) = 6 then 
     return 't'; 
    end if; 

    -- code that check if 'd' is marked as holiday in calendar 
    --select count(*) into hcnt from prazkal where datpra = d; 
    --if hcnt > 0 then 
    -- return 't'; 
    --end if; 

    return 'f'; 
end function; 

第二功能降低一些日子省略節假日日期:

create function move_date_back(start_d datetime year to day, count_days integer) 
returning datetime year to day; 
define new_d datetime year to day; 
define i integer; 
    let i = 0; 
    let new_d = start_d; 

    while i < count_days 
     let new_d = new_d - interval(1) day to day; 
     if not is_holiday(new_d) then 
      let i = i + 1; 
     end if; 
    end while; 

    return new_d; 
end function;