由於最近系統開發,需要產生一個特定條件的連續時間區段(如下圖),在此簡單紀錄作法。
條件:
- 時間區段的定義是有兩個時間,起始時間跟結束時間。
- 每個時間區段為20分鐘。
- 每三個時間區段的下一個時間區段多5分鐘。
- 整個連續時間的完整區段是14:00~17:30。
解法思路:
- 使用遞迴,透過結束時間的不斷加總,當大於最終結束時間(17:30)時停止。
- 判斷哪個時間區段是[每3個時段的下一個時間區段],相當於以下方式:
2.1 序號取4的餘數 = 0
2.2 Index % 4 = 0
DECLARE @StartTime TIME = '14:00:00';
DECLARE @EndTime TIME = '17:30:00';
;WITH TimeSlots AS
(
-- Base case
SELECT @StartTime AS SlotStartTime,
DATEADD(MINUTE, 20, @StartTime) AS SlotEndTime,
1 AS Cnt
UNION ALL
-- Recursive part
SELECT
SlotEndTime AS SlotStartTime,
CASE
WHEN (Cnt + 1) % 4 = 0 THEN DATEADD(MINUTE, 25, SlotEndTime)
ELSE DATEADD(MINUTE, 20, SlotEndTime)
END AS SlotEndTime,
Cnt + 1
FROM TimeSlots
WHERE SlotEndTime < @EndTime
)
-- Output
SELECT
CONVERT(TIME, SlotStartTime) AS StartSlot,
CONVERT(TIME, SlotEndTime) AS EndSlot,
DATEDIFF(SECOND, SlotStartTime, SlotEndTime) / 60 AS 'Duration',
DATEDIFF(SECOND, SlotStartTime, SlotEndTime) / 60 - 20 AS 'Diff'
FROM TimeSlots
WHERE SlotEndTime <= @EndTime;