[MSSQL] 產生特定條件的連續時間區段


Posted by mike-hsieh on 2023-10-19

由於最近系統開發,需要產生一個特定條件的連續時間區段(如下圖),在此簡單紀錄作法。

條件:

  1. 時間區段的定義是有兩個時間,起始時間跟結束時間。
  2. 每個時間區段為20分鐘。
  3. 每三個時間區段的下一個時間區段多5分鐘。
  4. 整個連續時間的完整區段是14:00~17:30。

解法思路:

  1. 使用遞迴,透過結束時間的不斷加總,當大於最終結束時間(17:30)時停止。
  2. 判斷哪個時間區段是[每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;

#MSSQL #產生特定條件的連續時間區段 #產生時間區段







Related Posts

CSS 常用語法 (Cascading Style Sheets)

CSS 常用語法 (Cascading Style Sheets)

How to use AWS dynamoDB outside AWS Environment

How to use AWS dynamoDB outside AWS Environment

滲透測試基本技術 第三章 (005)

滲透測試基本技術 第三章 (005)


Comments