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

感谢它的工作 –