从过去 + 周期中的日期确定下一个日期(包括当前日期)



在SQL Server中 - 如何从给定的日期+周期(以天为单位(确定下一个日期(即今天或将来(。

例如:

2018 年 4 月 2 日 + 7 天周期的下一个日期为 4 月 23 日(在 4 月 20 日撰写此问题时(。

我正在寻找一个数学/mod解决方案,而不是日历表,因为有问题的数据很大(数百万行(。

示例/到目前为止我尝试过:

CREATE TABLE #temptable
(
    [OrderDate] DATE,
    [Cycle] SMALLINT
);
INSERT INTO #temptable
VALUES
     ( N'2018-03-26T00:00:00', 7 ),
     ( N'2018-03-26T00:00:00', 14 ),
     ( N'2018-03-26T00:00:00', 28 ),
     ( N'2018-03-26T00:00:00', 56 ),
     ( N'2018-04-02T00:00:00', 7 ),
     ( N'2018-04-02T00:00:00', 2 ),
     ( N'2018-04-09T00:00:00', 7 ),
     ( N'2018-04-16T00:00:00', 7 );
SELECT   OrderDate,
         Cycle,
         DATEDIFF(DAY, OrderDate, GETDATE()) / Cycle AS Cycles,
         DATEDIFF(DAY, OrderDate, GETDATE()) % Cycle AS CyclesRemainder,
         NULL AS NextDate
FROM     #temptable
ORDER BY OrderDate;
DROP TABLE #temptable;

我认为您很接近,您有自开始日期以来经过的周期数,但目前将其表示为整数,您希望将其作为自动舍入的十进制值。

SELECT   OrderDate,
         Cycle,
         DATEDIFF(DAY, OrderDate, GETDATE()) / convert(decimal(10,2),Cycle) AS Cycles,
         DATEDIFF(DAY, OrderDate, GETDATE()) % Cycle AS CyclesRemainder,
         dateadd(d, cycle * ceiling(DATEDIFF(DAY, OrderDate, GETDATE()) / convert(decimal(10,2),Cycle)), orderdate) AS NextDate
FROM     temptable
ORDER BY OrderDate;

http://www.sqlfiddle.com/#!18/2f4db/5

当下一个周期是今天的边缘情况时,您可以从您计算的其余部分中看到这一点。这就是天花板保护你的地方,因为它总是四舍五入。如果周期是整数,它将保持原样,当您通过 3.5 个周期时,它将四舍五入为 4,然后添加 4 * 个周期来获得您的日期。

具有 7/2 天周期的 2018-04-02 很好地暴露了该边缘情况,然后查询的结果分别为 2018-04-23 和 2018-04-20(供以后读者使用,这是在 20 日计算的(

最新更新