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

时间:2018-04-20 10:35:00

标签: sql sql-server sql-server-2008 tsql sql-server-2012

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

例如:

2018年4月2日+ 7天周期将有4月23日的NextDate(在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;

1 个答案:

答案 0 :(得分:2)

我认为你很接近,你有自开始日期以来已经过的周期数,但是当前表示为一个整数,你希望它作为一个十进制值自动向上舍入。

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 *个循环。

具有7/2天周期的2018-04-02很好地暴露了边缘情况,查询的结果分别是2018-04-23和2018-04-20(为了未来的读者目的,这是计算在20)