在SQL中将时间间隔数据扩展为几天

时间:2014-05-06 22:12:02

标签: sql sql-server date

假设我的数据如下所示:

interval_id indiv_id   role start_date   end_date
          1        1      A 2006-05-01 2006-06-16
          2        1      B 2006-06-16 2006-10-16
          3        1      A 2006-10-16 2009-10-16
          4        1      B 2009-10-16 2014-04-23
          5        2      A 2007-12-15 2009-10-16
          6        2      B 2009-10-16 2011-07-01

但我希望数据看起来像这样(以第一个角色间隔为例):

interval_id indiv_id   role        day
          1        1      A 2006-05-01
          1        1      A 2006-05-02
          1        1      A 2006-05-03
          1        1      A 2006-05-04
          1        1      A 2006-05-05
          1        1      A 2006-05-06
        ...      ...    ...        ...
          1        1      A 2006-06-16

我已经问过并接受了how to best do this in R的答案。我如何在MS SQL中执行此操作?

在形成答案时,假设没有NULL数据。

感谢。

2 个答案:

答案 0 :(得分:1)

首先创建一个数字表:

DECLARE @number_of_numbers INT = 100000;

;WITH
a AS (SELECT 1 AS i UNION ALL SELECT 1),
b AS (SELECT 1 AS i FROM a AS x, a AS y),
c AS (SELECT 1 AS i FROM b AS x, b AS y),
d AS (SELECT 1 AS i FROM c AS x, c AS y),
e AS (SELECT 1 AS i FROM d AS x, d AS y),
f AS (SELECT 1 AS i FROM e AS x, e AS y),
numbers AS 
(
    SELECT TOP(@number_of_numbers)
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number
    FROM f
)

创建一个变量@MinDate,这是表中最早的日期(或者你可以选择类似1/1/2000等的东西 现在加入你的桌子对着那个cte数字表,你会得到你的个人日期:

SELECT m.interval_id, m.indiv_id, m.role, b.CheckDate 
FROM MyTable m
INNER JOIN
(
    SELECT DATEADD(DAY, n.Number, @MinDate) AS CheckDate
    FROM numbers n

) AS b
    ON b.CheckDate >= m.start_date AND b.CheckDate <= m.end_date  
ORDER BY b.CheckDate

答案 1 :(得分:0)

我知道它不是一个好主意......但你可以对已经存在的数据做一个光标,并使用dateadd的while,以便它从每个记录的Start到end迭代,然后将它插入到你的位置需要它。