2017-05-22 116 views
-1

如何將日期範圍轉換爲每天爲1行並且當天的開始和結束時間?如何將SQL日期範圍轉換爲每日行

I looked at this post about date ranges to row - 但這是一個不同的問題。上面提到的另一個解決方案並沒有給出從開始到結束的每一天的時間 - 因此不允許進行佔空係數或利用率計算,或者構建甘特圖。

我們將有一個ID字段,一個開始日期和一個結束日期作爲我們的基表。我們希望將其轉換爲每天包含ID字段,並在該範圍內消耗多少時間。

將開始日期和結束日期轉換爲日常工作因子和許多其他需求(如設備利用率)時,這非常有用。

+0

標記您正在使用的dbms,您已經有一個產品特定的答案。 – jarlh

+0

添加一些示例表數據和預期結果。同時向我們展示您當前的查詢嘗試。 – jarlh

+0

[如何在SQL Server中生成一系列日期]的可能重複(https://stackoverflow.com/questions/11141507/how-to-generate-a-range-of-dates-in-sql-server) – McNets

回答

0

我從這個社區找到了很多幫助。我想把最後的SQL腳本放在這裏供其他人使用。

WITH cte ([VID],[StartTime],[EndTime]) AS 
    (SELECT tbl.[ID] as 'VID' 
       ,CONVERT(VARCHAR(19), tbl.[StartDT], 120) AS 'StartTime' 
       ,CASE 
       WHEN tbl.[EndDT] <= CONVERT(VARCHAR(11), tbl.[StartDT]+1, 120) + '00:00:00' THEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) 
       ELSE CONVERT(VARCHAR(11), tbl.[StartDT]+1, 120) + '00:00:00' 
       END as 'EndTime' 
     FROM [SourceTable] as tbl 
     WHERE DATEDIFF(DAY,tbl.[StartDT],tbl.[EndDT])<=365 

     UNION ALL 

     SELECT tbl.[ID] as 'VID' 
       ,CONVERT(VARCHAR(11), DATEADD(DAY, 1, cte.[StartTime]), 120) + '00:00:00' AS 'StartTime' 
       ,CASE 
       WHEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) < CONVERT(VARCHAR(11), DATEADD(DAY, 2, cte.[StartTime]), 120) + '00:00:00' 
       THEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) 
       ELSE CONVERT(VARCHAR(11), DATEADD(DAY, 2, cte.[StartTime]), 120) + '00:00:00' 
       END AS 'EndTime' 
     FROM cte 
      INNER JOIN [SourceTable] as tbl 
       ON cte.VID = tbl.ID 
     WHERE CONVERT(VARCHAR(11), cte.[StartTime], 120) < CONVERT(VARCHAR(11), tbl.[EndDT], 120)) 

SELECT VID AS ID 
     ,[StartTime] 
     ,[EndTime] 
     ,DateDiff (second,[StartTime],[EndTime])/3600 As 'Hours' 
     ,DateDiff (second,[StartTime],[EndTime])/60 % 60 as 'Minutes' 
     ,((DateDiff (Second,[StartTime],[EndTime])/3600)*60)+(DateDiff (second,starttime,endtime)/60 % 60) as 'Total Minutes' 
     ,DATEPART(week,[StartTime]) AS weeknum 
     ,MONTH([StartTime]) AS MonthNumber 
     ,DATENAME(month,[StartTime]) AS MonthName 

    FROM cte order by Id, [StartTime] 
    option (maxrecursion 0); 
+0

對沒有指定dbms的問題的產品特定答案。至少告訴我們這是爲什麼。 – jarlh

+0

它似乎SQL Server ... –

+0

是的,我的道歉,我把SQL放在標籤。它是SQL。 –

相關問題