在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;
答案 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)