SQL 检查日期范围是否超出限制

SQL check if between daterange exceeds the limit

在我当前的存储过程中,我从当前数据 table 和存档数据 table 中获取数据,其中我从两个来源获取 "union all" Select 语句。

但是程序执行时间比较长,所以想办法优化性能。就我而言,我决定有条件地检查存档数据是否存在。

就我而言,如果数据超过当天的 45 天限制,则会将其存档。

为简单起见,以下是2个简化的案例。如果用户选择当前月份(在我们的例子中是五月,05/02 是当前日期),日期范围将仅在当前数据集中,因为我们还没有突破 45 天的限制(在 05/01 和 05/31 之间) . 4 月也是如此(日期范围在 04/01 和 04/30 之间),因为 30 天仍在 45 天限制内 + 5 月后 2 天。

但是,如果用户在当天选择三月,它的某些天将超过 45 天的限制(日期范围在 03/01 和 03/31 之间),这就是我需要的情况查看存档数据并将所有数据与当前数据合并。

我的问题如下:检查日期范围是否超过 n 天限制的最佳方法是什么?

如果事情就这么简单,你可以使用 DATEDIFF()

Returns the count (signed integer) of the specified datepart boundaries crossed between the specified startdate and enddate.

IF DATEDIFF(DAY, @StartDate, GETDATE()) < 45
BEGIN
    -- Pseudo query
    SELECT *
    FROM dbo.Table
    WHERE CreatedAt > @StartDate;
END;
ELSE
    -- Another pseudo query
    SELECT *
    FROM dbo.Table
    WHERE CreatedAt > @StartDate
    UNION ALL
    SELECT *
    FROM Archive.Table
    WHERE CreatedAt > @StartDate;
END;

最后,如果你想避免条件语句,我想你可以在你的存档上创建一个覆盖索引 table(我不确定它有多大)你的时间戳成为第一把钥匙。拥有 SQL 服务器将有效地搜索该索引,您的代码将更易于维护和阅读。

像这样:

SELECT *
FROM (
    SELECT *
    FROM dbo.Table
    UNION ALL
    SELECT *
    FROM Archive.Table
    ) AS T
WHERE T.CreatedAt > @StartDate;

为了进一步提高性能。您可以为您的存档添加一个约束 table,例如:

ALTER TABLE Archive.Table
ADD CONSTRAINT CK_ArchiveTable_CreatedAt CHECK (DATEDIFF(DAY, CreatedAt, GETDATE()) < 45);

如果您的 @StartDate 少于 45 天,这应该提示 SQL 服务器不要查询此 table。请记住,这可以使用 DATEADD() 重写。它可能会更有效率。