【问题标题】:Expand time interval data into days in SQL在 SQL 中将时间间隔数据扩展为天
【发布时间】:2014-05-06 22:12:02
【问题描述】:

假设我有如下数据:

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 数据。

谢谢。

【问题讨论】:

  • 查看this 了解如何在 SQLServer 中创建日历
  • 虽然我确信您有理由这样做,但我认为您的数据库系统不应该这样做。
  • 为什么不呢?我需要一直这样做。

标签: sql sql-server date


【解决方案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

【讨论】:

    【解决方案2】:

    我知道这不是一个好主意...但是您可以将光标悬停在您已经拥有的数据上,并在 dateadd 中使用一段时间,以便它从开始到结束对每条记录进行迭代,并将其插入到您需要的位置需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      • 2010-09-20
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多