首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Do while SQL Server中的do while

在Do while SQL Server中的do while
EN

Stack Overflow用户
提问于 2017-07-17 10:26:03
回答 2查看 100关注 0票数 1

我刚刚创建了一个计划项目,需要帮助..

我有一个日程表数据

代码语言:javascript
复制
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

我需要让它看起来像这样:

代码语言:javascript
复制
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

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-07-17 10:28:51

一种方法是使用递归CTE:

代码语言:javascript
复制
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也可能是保留字),所以如果它们是实际的列名,就应该对它们进行转义。

票数 3
EN

Stack Overflow用户

发布于 2017-07-17 12:16:53

你需要一个日程表来做这件事。我更喜欢在我的数据库中创建一个物理日历表,并在这样的情况下使用它。下面是使用计数表法动态生成日期的一种方法

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45135148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档