【问题标题】:calculate difference between two dates and generate new row for each entry计算两个日期之间的差异并为每个条目生成新行
【发布时间】:2016-04-03 23:47:52
【问题描述】:

我目前正在研究 SSIS。我有一个包含两列开始日期和结束日期的表格。我需要计算两者之间的天数(包括开始日期和结束日期)并为每一天生成一行,并重复其他数据。结果日期应存储在新列中。

【问题讨论】:

  • 您需要显示所需的输出。
  • 您指出源是一个表,其列如上面的屏幕截图所示。这是 SQL Server 吗?如果是这样,您使用的是哪个版本(2005、2008、2012、2014、2016)?
  • “中间天数”? “结果日期”?不清楚你在问什么。

标签: sql ssis


【解决方案1】:

完成这项工作的诀窍是有一个表格,其中包含可能范围内的所有日期的列表。

在下面的查询中,我使用我们集合MIN(Start) 中的最小日期来伪造它。

然后,我根据 sys.all_columns 视图中的列数生成从 1 到 N 的数字序列。这可能就足够了,它可能不是,但基于数据的缺乏,它现在可以工作。如果您需要生成更多日期,请针对自身交叉应用 sys.all_coumns 表。

然后我使用生成的数字通过dateadd 构建日期列表

然后,我使用我的 ALLDATES 派生表并对原始表执行 INNER JOIN,将为 ALLDATES 生成的日期固定在 Start 和 End 列之间(包括端点)。

CREATE TABLE dbo.so_36392684
(
    WeekNo int NOT NULL
,   Start datetime NOT NULL
,   [End] datetime NOT NULL
,   SpecialEvents varchar(20) NULL
);

INSERT INTO
    dbo.so_36392684
(WeekNo, Start, [End], SpecialEvents)
VALUES
(
    1
,   '1989-09-14'
,   '1989-09-20'
,   NULL
);


SELECT
    S.WeekNo
,   S.Start
,   S.[End]
,   S.SpecialEvents
,   ALLDATES.ConsecutiveDays
FROM
    (
        SELECT
            DATEADD(DAY, D.rn, S.Start) AS ConsecutiveDays
        FROM
            (
                -- Find the first date in our table
                SELECT
                    MIN(S.Start) AS Start
                FROM
                    dbo.so_36392684 AS S
            ) AS S
            CROSS APPLY
            (
                -- Generate a (hopefully) sufficiently large enough set of dates
                SELECT
                    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS rn
                FROM
                    sys.all_columns AS AC
            ) D
    ) AS ALLDATES
    INNER JOIN
        dbo.so_36392684 AS S
        ON ALLDATES.ConsecutiveDays >= S.Start
        AND ALLDATES.ConsecutiveDays <= S.[End];

结果应该是这样的

WeekNo  Start       End         SpecialEvents   ConsecutiveDays
1       1989-09-14  1989-09-20  NULL            1989-09-14
1       1989-09-14  1989-09-20  NULL            1989-09-15
1       1989-09-14  1989-09-20  NULL            1989-09-16
1       1989-09-14  1989-09-20  NULL            1989-09-17
1       1989-09-14  1989-09-20  NULL            1989-09-18
1       1989-09-14  1989-09-20  NULL            1989-09-19
1       1989-09-14  1989-09-20  NULL            1989-09-20

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2021-11-25
    • 2011-08-01
    • 2013-08-28
    相关资源
    最近更新 更多