簡體   English   中英

Pivot 時間間隔成矩陣

[英]Pivot Time Between into a Matrix

如何將 pivot 的開始、結束、開始中斷和結束中斷時間轉換為如下所示的矩陣? 理想情況下,我想在 SQL 服務器中完成此操作。

本質上,我試圖將全天的時間表(開始時間、結束時間、開始休息時間、結束休息時間)和 pivot (按 15 分鍾增量細分)可視化為 1 或 0。

開始時間 時間結束 休息開始 休息開始 0:00 0:15 0:30 0:45 1:00 1:15 1:30 1:45 2:00 2:15
0:15 2:00 0:45 1:15 0 1 1 0 0 1 1 1 0 0

假設您對每個時間表記錄都有一個 ID 或唯一標識符,並假設您的所有時間表條目僅使用時間而不是日期時間,這將起作用。

DROP TABLE IF EXISTS #Timesheets
GO
CREATE TABLE #Timesheets(ID INT, StartTime TIME, EndTime TIME, BreakStart TIME, Breakend TIME)
INSERT INTO #Timesheets(ID, StartTime,EndTime,BreakStart,Breakend)
VALUES
(1,'00:15','02:00','00:45','01:15'),
(2,'08:00','17:00','12:00','13:00')
DECLARE @StartTime TIME = '00:00'
DECLARE @EndTime TIME = DATEADD(mi,1425,@StartTime)


;WITH TimePeriods AS 
(
  SELECT @StartTime AS StartTime,DATEADD(mi,15,@StartTime) AS EndTime, CONVERT(VARCHAR(5),@StartTime,108) AS TimePeriod 
  UNION ALL 
  SELECT DATEADD(mi,15,StartTime),DATEADD(mi,30,StartTime), CONVERT(VARCHAR(5),DATEADD(mi,15,StartTime),108) FROM TimePeriods
  WHERE StartTime < @EndTime
)
--select string_agg(QUOTENAME(TimePeriod),',') from TimePeriods

,TimeSheetPerPeriod AS
(
SELECT 
tp.TimePeriod,
ts.*,
CASE WHEN ts.ID IS NULL THEN 0 ELSE 1 END AS Active
FROM TimePeriods tp
JOIN #Timesheets ts ON tp.StartTime BETWEEN ts.StartTime AND ts.EndTime
AND tp.StartTime NOT BETWEEN ts.BreakStart AND ts.Breakend
)

SELECT 
id,StartTime,EndTime,BreakStart,Breakend
,[00:00],[00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],[02:15],[02:30],[02:45],[03:00],[03:15],[03:30],[03:45],[04:00],[04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],[06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],[08:15],[08:30],[08:45],[09:00],[09:15],[09:30],[09:45],[10:00],[10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],[12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],[14:15],[14:30],[14:45],[15:00],[15:15],[15:30],[15:45],[16:00],[16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],[18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],[20:15],[20:30],[20:45],[21:00],[21:15],[21:30],[21:45],[22:00],[22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45]
FROM
(
SELECT * 
FROM TimeSheetPerPeriod
) AS SourceTable
PIVOT
(
MAX(Active)
FOR TimePeriod IN ([00:00],[00:15],[00:30],[00:45],[01:00],[01:15],[01:30],[01:45],[02:00],[02:15],[02:30],[02:45],[03:00],[03:15],[03:30],[03:45],[04:00],[04:15],[04:30],[04:45],[05:00],[05:15],[05:30],[05:45],[06:00],[06:15],[06:30],[06:45],[07:00],[07:15],[07:30],[07:45],[08:00],[08:15],[08:30],[08:45],[09:00],[09:15],[09:30],[09:45],[10:00],[10:15],[10:30],[10:45],[11:00],[11:15],[11:30],[11:45],[12:00],[12:15],[12:30],[12:45],[13:00],[13:15],[13:30],[13:45],[14:00],[14:15],[14:30],[14:45],[15:00],[15:15],[15:30],[15:45],[16:00],[16:15],[16:30],[16:45],[17:00],[17:15],[17:30],[17:45],[18:00],[18:15],[18:30],[18:45],[19:00],[19:15],[19:30],[19:45],[20:00],[20:15],[20:30],[20:45],[21:00],[21:15],[21:30],[21:45],[22:00],[22:15],[22:30],[22:45],[23:00],[23:15],[23:30],[23:45]) 
) AS PivotTable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM