我需要制定一個輪班時間表,每年都需要完成,所以我想撰寫腳本。
我有 4 個班次,每個班次都有自己的開始停止時間(通常相同的模式)就像 A / B 是早上 8 點到晚上 8 點(4 天),然后 C / D 是晚上 8 點到早上 8 點,持續 4 天)輪班交替 A/B 4 天然后是 C/D 4 天。
我知道有人這樣做了,但我需要幫助才能知道如何或從哪里開始撰寫代碼。我知道我需要一張包含開始和停止時間的班次表,一張假期表(也許——我認為可能有一些內置的東西可以做到這一點)。
然后我需要時間表的實際表格.. Shift,Start,Stop,Day/Night,Holiday。4 天休息 4 天 - 如果我提供 12 月 28 日的開始日期,則按月完成一年的完整時間表。
我怎樣才能做到這一點?
我發現這個寶石每天都在做年度化,我想我需要查一些數學來讓它在 4 上 4 下迭代,也許可以加入兩個表
uj5u.com熱心網友回復:
我不知道這是否適合您使用。盡管如此,這里有一個腳本將在跳過假期串列時生成輪班串列。雖然內置了大量假設,但適應類似模式應該不是非常困難:
with const as (
select cast('20211228' as date) as basedate, 8 as cycle_length
), holidays as (
select holiday
from const cross apply (values
(datefromparts(year(basedate) 1, 2, 14)),
(datefromparts(year(basedate) 1, 3, 17)),
(datefromparts(year(basedate) 1, 7, 4)),
(datefromparts(year(basedate) 1, 10, 31))
) as h(holiday)
), numbers as (
select n
from (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) as n(n)
), cycles as (
select cycle.n (n0.n 10 * n1.n) * cycle_length as daynum
from numbers n0 cross join numbers n1 cross join numbers cycle cross join const
where cycle.n < cycle_length and cycle.n (n0.n 10 * n1.n) * cycle_length < 367
)
select schedule_date, description
from const cross apply cycles cross apply
(select dateadd(day, daynum, basedate) as dt) d cross apply
(select count(*) from holidays where holiday <= dt) h(skips) cross apply
(select n from numbers where n in (1, 2)) s(shift) cross apply
(values (
dateadd(day, skips, dt),
case daynum / (cycle_length / 2) % 2
when 0 then case shift when 1 then 'A 8am-8pm' else 'B 8pm-8am' end
when 1 then case shift when 1 then 'C 8am-8pm' else 'D 8pm-8am' end
end
)) v2(schedule_date, description)
order by schedule_date;
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=1d03e27163bd37484d2d5c288eb9e80c
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/452746.html
