【问题标题】:Determine next date (including current date) from a date in the past + cycle从过去的日期+周期确定下一个日期(包括当前日期)
【发布时间】:2018-04-20 10:34:59
【问题描述】:

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

例如:

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

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

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

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;

【问题讨论】:

  • 一张涵盖未来 20 年的日历表本身不足 8000 行。您从哪里获得数百万行?
  • 我将“百万行”的含义作为输入数据,而不是日历数据。
  • @Andrew - 但即便如此,为什么由数百万行组成的 input 排除了日历表的使用?这就是我不明白的。如果有的话,它会使用日历表将推向,因为它更有可能实现基于集合的良好结果。
  • @Damien_The_Unbeliever - 不是,但那是 OP 的职权范围。我也不确定日历表在这里是否有很大帮助,因为它是一个数学问题。

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


【解决方案1】:

我认为你已经接近了,你有自开始日期以来已经过去的周期数,但当前将此表示为整数,你希望将其作为十进制值自动四舍五入。

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 号)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多