0

嗨,我有一张如下表,

Id      StartDt          EndDt       
-----   --------         -------
123     01-Apr-2016      15-Apr-2016
456      02-Apr-2016     03-Apr-2016

我想编写一个适用于所有数据库平台的通用 sql Insert 语句。

这样我就会将类似于下面的数据插入到上面的新表中

插入后的新表值:

Id       Date           SeqNo
123      01-Apr-2016       1
123      02-Apr-2016       2
123      03-Apr-2016       3
123      04-Apr-2016       4
123      05-Apr-2016       5
123      06-Apr-2016       6
123      07-Apr-2016       7
123      08-Apr-2016       8
..
..
..
..
123      15-Apr-2016       15,


AssignmentID    Date    SeqNo
123 1-Apr   1
123 2-Apr   2
123 3-Apr   3
123 4-Apr   4
123 5-Apr   5
.       
.       
.       
.       
.       
123 15-Apr  15

所以第一行有十五行,即(结束日期 - 开始日期),主表的第二行同样有两行(结束日期 - 开始日期)。

4

2 回答 2

0

您将创建一个区间表,其中包含从 0 到 9999 的所有整数。您可以通过编程方式执行此操作:

CREATE TABLE intervals (period int);
INSERT INTO intervals (period) VALUES (0),(1);
DECLARE @rowCnt int;
SELECT @rowCnt = 2;
WHILE (SELECT Count(*) FROM intervals) < 10000 BEGIN
    INSERT INTO intervals (period) SELECT period + @rowCnt FROM intervals WHERE period + @rowCnt < 10000;
    SELECT @rowCnt = @rowCnt * 2
END;

循环第一次运行时,它会插入 2 行,值为 2 和 3,然后是 4 行,以此类推,直到表已满。

然后,您通过将该表与包含日期的表交叉连接来插入,并插入(开始日期 + 间隔(天)),其中开始日期 + 间隔 <= 完成日期。

于 2016-04-21T04:14:48.973 回答
0

这最好在 UDTF 中完成。UDTF 将输入 2 个值并导出日期范围。此实现将类似于 Explode。

于 2016-04-21T05:18:00.317 回答