SQL Server:填写每个实体具有不同日期范围的缺失日期

Posted

技术标签:

【中文标题】SQL Server:填写每个实体具有不同日期范围的缺失日期【英文标题】:SQL Server: Filling in missing dates where each entity has different date ranges 【发布时间】:2015-06-05 18:35:09 【问题描述】:

我有一个包含多个实体的数据集,每个实体都有一系列日期的数据(每月报告)。每个实体都有不同的开始和结束日期。每个实体可能有几个月没有报告数据。

我需要将此数据复制到另一个表中,为实体在该实体的特定日期范围内没有报告数据的每个月填写默认值。

我的数据集非常大(数万个实体),每个实体每个月都有几十年的数据。

我已尝试使用覆盖时间范围的每个实体的记录来初始化目标表,该时间范围应包括所有实体可能的最小和最大日期。然后在其日期范围的开始和结束时为每个实体修剪未填充的记录。这会生成数百万个最终被删除的虚拟记录。这个过程需要几个小时。

我需要更快的东西。

【问题讨论】:

提供样本数据和预期结果以加快响应速度 右连接到包含您希望在结果中显示的所有日期的表。这是一个非常常见的问题的非常常见的解决方案。 Query for how to add the missing dates in sql的可能重复 您能否查询每个实体的 min(start) 和 max(end),并且只为该实体输入那些月份的默认值,而不是输入所有的 min/max 的默认值实体? 对于 Beth - 我可以获得每个实体的最小和最大日期。我不确定如何构造一个查询来循环遍历所有实体和日期。这会起作用,但似乎仍然应该有一个查询可以即时填补空白。 【参考方案1】:

我不喜欢有一张满是日期的桌子来加入或担心。我会使用如下函数:

CREATE FUNCTION dbo.GetAllMonths(@Start DATETIME, @End DATETIME)
RETURNS
@AllMonths TABLE
(
MonthStart DATETIME,
NextMonth DATETIME
)
AS
BEGIN
    DECLARE @Temp DATETIME

    IF @Start > @End
    BEGIN
        SET @Temp = @Start
        SET @Start = @End
        SET @End = @Temp
    END

    -- Get first day of the month
    SET @Start = DATEADD(month, DATEDIFF(month, 0, @Start), 0)


    WHILE @Start <= @End
    BEGIN
        SET @Temp = DATEADD(MONTH, 1, @Start)

        INSERT INTO @AllMonths
        VALUES(@Start, @Temp)

        SET @Start = @Temp
    END

RETURN

END

然后你会像这样使用它:

SELECT *
FROM dbo.GetAllMonths('4/15/2015', '10/1/2015') m
LEFT JOIN RequestItems r
ON m.MonthStart <=  r.ModifiedDate 
    AND  r.ModifiedDate < m.NextMonth
WHERE r.Id is null  -- to get the missing ones only

【讨论】:

我会看看这个函数。我仍然必须处理具有自己日期范围的每个实体。我必须遍历所有实体,找出其特定的日期范围并使用您的函数来填充该实体的范围。 @user1753352 查看编辑,添加最后一行以仅获取缺少的月份。

以上是关于SQL Server:填写每个实体具有不同日期范围的缺失日期的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2012 中创建以日期为范围分区的表

SQL Server 成员资格日期范围

如何从 sql server 2008 中具有不同 TaskIds 的表中查找日期?

SQL 检索具有不同序列号的所有记录,在日期范围和计数之间,拒绝代码 = "Low Current"

如何识别 T-SQL 中每个不同成员的多个开始和结束日期范围中的第一个间隙

如何在实体框架中查找具有指定日期范围列表的日期?