2014-07-11 2 views
0

Informix 데이터베이스에서 데이터를 선택하기위한 C 쉘 스크립트를 작성하고 있습니다. 근무일 기준 8 일 전. 나는 휴일에 테이블 "prazkal"를 만든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) 

같이 보이 :

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 

... 

지금까지 나는 다음과 같습니다 과거 + 일요일과 토요일 8 일 계산 SQL 코드를 주말과 휴일을 고려하여 과거 8 일을 계산하기 위해 SQL을 확장하는 법을 모르겠습니다.

+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; 
관련 문제