2017-11-07 2 views
-1

배경 : 직원이 유급 휴가 요청을 제출하는 휴일 관리 시스템.날짜 범위의 날짜를 삽입하는 루프 만들기

각 직원 휴가 요청에 대해 주어진 날짜 범위에 대해 "반나절"을 만들어야합니다.

소스 테이블 : 요청 (모든 요청이 저장되고, 각 사원 용 1 개 라인)

id (bigint-PK) 
begin_date (date) 
begin_in_afernoon (bool) 
end_date (date) 
end_in_morning (bool) 
UserID (int) 

샘플 데이터 :

1 | 08/11/2017 | False | 09/11/2017 | False | 10 

대상 테이블 : Half_day_absence

,451,515,
Date (date) 
Day_Period (string) 
Total 
UserID 
RequestID 

샘플 데이터 :

08/11/2017 01:00:00 | AM | 0.5 | 10 | 1 
08/11/2017 13:00:00 | PM | 0.5 | 10 | 1 
09/11/2017 01:00:00 | AM | 0.5 | 10 | 1 
09/11/2017 13:00:00 | PM | 0.5 | 10 | 1 

내가 사전에 half_day_absence 테이블에

덕분에 새로운 라인을 삽입하는 각 직원의 요청에 대한 루프를 만드는 방법에 붙어

답변

0

답장을 보내 주셔서 감사합니다. 코드를 통해 루핑 작업을 수행 할 수있는 방법을 알게되었습니다. 그러나 반복 할 필요가없는 또 다른 해결책, generate_series() 함수를 발견했습니다. 누군가에게 도움이 될 수 있다면 여기 내 SQL 코드의 조각은 다음과 같습니다

select 
row_number() over (order by id), --id of new row in destination table 
gs as date, 
extract(dow from gs) as day_of_week, --Sunday=0/Saturday=6/Monday to Friday=1 à 5 
CASE 
    WHEN extract(hour from gs) < 13 THEN 'AM'::varchar 
    WHEN extract(hour from gs) >=13 THEN 'PM'::varchar 
END As day_period 
from 
(
    select 
    id, 
    CASE 
     WHEN begin_in_afternoon=false THEN begin_date::date + interval '1' HOUR --business rule: AM started at 1AM 
     WHEN begin_in_afternoon=true THEN begin_date::date + interval '13' HOUR --business rule: PM started at 1PM 
    END as begin_date, 
    CASE 
     WHEN end_in_morning=false THEN end_date::date + interval '13' HOUR --business rule: PM started from 1PM 
     WHEN end_in_morning=true THEN end_date::date + interval '1' HOUR --business rule: AM started at 1AM 
    END as end_date 
    from myTable 
) h, 
generate_series(h.begin_date, h.end_date, interval '0.5 day')gs 
where extract(dow from gs)not in (0,6); --Sunday and Saturday excluded 

이 SELECT는 다음 INSERT INTO로 전송되는 대상 테이블

0

개인 테스트는 아니지만이 양식 주위에 있어야합니다.

DO 
$$ 
DECLARE 
    rec record; 
    nbd integer; 
BEGIN 
    for rec in select begin_date, begin_in_afernoon, end_date, end_in_morning, userid, EXTRACT('days' FROM (end_date - begin_date)) AS nbdays 
       from holidays; 
    LOOP 
     nbd = record.nbdays; 

     IF end_in_morning = 't' THEN 
      INSERT INTO Half_day_absence (begin_date, 'AM', 0.5, record.userid); 
     END IF; 

     IF end_in_afternoon = 't' THEN 
      INSERT INTO Half_day_absence (end_date, 'PM', 0.5, record.userid); 
     END IF; 

     IF end_in_morning = 'f' AND end_in_afternoon = 'f' THEN 
      WHILE nbd > 0 LOOP  
       INSERT INTO Half_day_absence (begin_date + '' || nbd || ''days', 'AM', 0.5, record.userid); 
       INSERT INTO Half_day_absence (begin_date + '' || nbd || ''days', 'PM', 0.5, record.userid); 
       nbd := nbd - 1; 
      END LOOP; 
     END IF; 

     RETURN next; 
    END LOOP; 
END 
$$; 

더 나은 마침표를 만들어야하지만 아이디어는이 공식을 중심으로합니다.

희망 도움말.

+0

안녕 하브에 결과 집합을 삽입 .. 절, 감사합니다 귀하의 회신에 대한 힙을, 나는 테스트하고 알려 드리겠습니다. – Esperanza

관련 문제