2017-11-07 24 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

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