在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 日计算的(