跨多个日期范围计算开始日期

Posted

技术标签:

【中文标题】跨多个日期范围计算开始日期【英文标题】:Calculating Starting Date Across Multiple Date Ranges 【发布时间】:2016-03-25 16:22:41 【问题描述】:

我有一段时间无法解决的 SQL 问题。我到处找都没有运气。我花了很多时间查看 ***,并认为这里有人可以提供帮助。

我需要能够跨多个范围确定开始日期 x 天数。例如:

Range || Ending Date of Range (date) ||  Number of Days in Range (int)
1     ||  2/20/2013                  ||         44
2     ||  9/5/2014                   ||         75
3     ||  3/25/2016                  ||         20

我有 3 个范围持续不同的时间,每个范围都有结束日期。日期范围从不重叠。我需要计算一个特定的数字,比如 100 天,回到范围内。在上面的例子中。答案是 2/15/13。

20 + 75 = 95 天。 100 - 95 = 5 天。因此,从 2013 年 2 月 20 日开始的 5 天是 2013 年 2 月 15 日。

有谁知道我可以如何在 SQL 查询中完成这项工作?

我相信最好的方法是将范围相加,直到总和通过所需的数字 (100),然后取之前的差 (95) 并从 (100) 中减去它,这样我就可以得到 (5)简单的日期数学。我可以使用任何编程语言轻松做到这一点,但使用 SQL 时我很吃力。

我真正需要帮助的是提出 (5) 和正确的结束日期 (2/20/2013)。我可以从那里处理日期数学。

我将不胜感激任何有关如何完成此任务的指导。提前致谢。

【问题讨论】:

您使用的是哪个 RDBMS?请标记它,因为每个都可以有自己的功能(尤其是在日期方面)。 我无法理解这一点。为什么你遗漏了范围1?我认为您需要更好地解释这里的逻辑。为什么要从范围 1 中减去 5?没有意义。 Tom - DB2... Ricardo - 重点是倒数到 100。日期范围 3 + 日期范围 2 = 95 剩下的是 5 我可以倒数 5 天那个范围。对不起,如果我不清楚。 【参考方案1】:

我在 Sybase 中试过这个:

SELECT
    max(CASE WHEN total_days >= chosen_days THEN end_date END)
    -
    min(CASE WHEN total_days < chosen_days THEN chosen_days - total_days ELSE chosen_days END)
FROM
    (
        SELECT a.end_date, sum(b.days_in_range) AS total_days, 100 AS chosen_days
        FROM test AS a JOIN test AS b ON a.end_date <= b.end_date
        GROUP BY a.end_date
    ) AS x

【讨论】:

我很感激你的建议,我会看看我能做些什么。再次感谢。

以上是关于跨多个日期范围计算开始日期的主要内容,如果未能解决你的问题,请参考以下文章

vue:element.ui中中日期时间范围选择控件怎么设置选择的范围,不能跨月选择

计算多个日期范围内有多少个重叠日期

js如何控制 开始日期 到 结束日期 跨月的判断?

给定日期范围(开始日期和结束日期),我如何计算天数,不包括 .Net 中指定的星期几?

处理跨时期的日期范围

将表中的日期与 TableAU 中的多个日期范围进行比较:构建 WHERE 语句