2017-07-17 55 views
1

我只需創建一個日程安排的項目和需要幫助..待辦事項而做在SQL Server

我有一個時間表數據

ID  Programme  Start  End   Division 
---------------------------------------------------------- 
M001 Math    1/1/2017 20/01/2017 Math 
M002 Aljabar   2/2/2017 20/02/2017 Math 
E001 Conversation  3/1/2017 25/01/2017 English 
E002 Vocabs   3/1/2017 20/02/2017 English 

我需要使它看起來像這樣:

ID  Date  
------------------ 
M001  1/1/2017 
M001  2/1/2017 
M001  3/1/2017 
so on until 20/1/2017 
M002  2/2/2017 
M002  3/2/2017 
so on until 20/02/2017 
E001  3/1/2017 
E001  4/1/2017 
so on until 25/01/2017 
E002  3/1/2017 
E002  4/1/2017 
so on until 20/02/2017 

感謝

做到這一點
+1

搜索「SQL Server的擴大日期範圍」對飛日期的一種方式。這個問題已被問及答覆了一千次。其中一個結果:https://stackoverflow.com/questions/26910398/expand-from-to-date-columns-to-1-row-per-day-within-that-range – Alex

+0

可能的重複[Expand「From 「&」要「在該範圍內將列每日排成1行)(https://stackoverflow.com/questions/26910398/expand-from-to-date-columns-to-1-row-per-day-within -that-range) – Alex

回答

3

一種方式是使用遞歸CTE:

with cte as (
     select id, start as dte, end 
     from t 
     union all 
     select id, dateadd(day, 1, dte), end 
     from t 
     where dte < end 
    ) 
select id, dte 
from cte 
order by id, dte; 

如果您有超過100天的時間,那麼您將需要使用MAXRECURSION選項。

注意:上面保留了問題中指定的列,假設這些列不是真名。很明顯,end是一個保留字(並且start可能是未來的一個),所以如果它們是實際的列名,它們應該被轉義。

+0

有一個錯誤說:「在關鍵字'end'附近的語法不正確 請幫助 –

+0

有可能使用do while選項嗎?我嘗試使用它,但不成功切換到另一個記錄。 。 –

+0

它的工作非常感謝,這個選項可以在插入到表格中使用嗎?我應該爲腳本添加什麼..thx –

1

您需要一個日曆表來執行此操作。我寧願在我的數據庫中創建一個物理日曆表,並在這種情況下使用它。這裏是產生使用符合表方法

DECLARE @minDate DATETIME 

SELECT @minDate = Min([Start]) 
FROM Yourtable 

;WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0) 
    ,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4 
    ,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16 
    ,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256 
    ,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536 
    ,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv3) 
SELECT ID, 
     Dateadd(DD, n - 1, @minDate) 
FROM Tally t 
     JOIN Yourtable a 
     ON Dateadd(DD, t.n - 1, @minDate) BETWEEN [Start] AND [End] 
ORDER BY ID,n; 

如果您想了解更多關於符合表檢查此鏈接Tally Tables in T-SQL

+0

感謝它的工作 –