【问题标题】:MySQL query to get sum of difference between Start date and End dateMySQL查询以获取开始日期和结束日期之间的差异总和
【发布时间】:2019-11-28 11:07:16
【问题描述】:

我有一个包含以下数据的表:

+-----------+-----------+
| Date_from | Date_to   |
+-----------+-----------+
| 20-NOV-19 | 22-NOV-19 |
+-----------+-----------+
| 10-NOV-19 | 21-NOV-19 |
+-----------+-----------+
| 14-NOV-19 | 26-NOV-19 |
+-----------+-----------+

我需要一个查询来找到date_fromdate_to 之间的差值之和。

例子:

  • 19 年 11 月 20 日和 2019 年 11 月 22 日之间相差 2 天
  • 19 年 11 月 10 日和 19 年 11 月 21 日之间的差异是 11 天,但查询必须将其视为 9 天,因为第一行中已经考虑了 11 月 20 日、11 月 21 日。
  • 19 年 11 月 14 日和 2019 年 11 月 26 日之间的差值为 12 天,但查询必须将其视为 4 天,因为上述行中已考虑了 11 月 14 日至 11 月 22 日的天数。

查询结果应该是

15 天 (2+9+4)

任何帮助将不胜感激。

【问题讨论】:

  • 你的两个日期列的类型是什么?它们是日期列、文本还是其他内容?
  • 它们是日期列
  • 假设从 2019 年 3 月 10 日到 2019 年 3 月 12 日的日期的额外条目只会在预期总和上增加两天,这是否正确?
  • 有人认为:datediff(max(Date_to),min(Date_from))-1 可以吗?
  • 我认为你必须先整理好你的日子。最低日期到最高日期。然后计算天差

标签: mysql


【解决方案1】:

您可以使用以下查询来获取总数。 请将 Table_name 更改为您的实际表名

SELECT SUM(TIMESTAMPDIFF(DAY,Date_from,Date_to)) as total FROM Table_name 

【讨论】:

    【解决方案2】:

    我在子查询中使用窗口函数来计算 date_from 和 date_to 之间的差异,然后减去任何重叠的天数

    SELECT SUM(days) FROM
        (SELECT CASE WHEN LEAD(date_from) OVER w  < date_to THEN DATEDIFF(date_to, date_from) + DATEDIFF(LEAD(date_from) OVER w, date_to)
              ELSE DATEDIFF(date_to, date_from)
              END AS days
              FROM test
              WINDOW w AS (ORDER BY date_to)) as d
    

    请注意,虽然这会产生 16 天的结果,而不是问题中的 15 天,但同样如此

    SELECT DATEDIFF('2019-11-26', '2019-11-10')
    

    【讨论】:

      【解决方案3】:

      您可以使用CTE 生成范围之间的所有日期并获取distinct count()。它将为您提供17 的总天数。由于您想要差异,因此您必须减去 2(开始日期和结束日期)

      WITH recursive Date_Ranges AS (
          select datefrom as Dt,dateto from mydates
         union all
         select dt + interval 1 day , dateto
         from Date_Ranges
         where dt < dateto)
      select count(distinct(dt))-2 from Date_Ranges 
      

      DEMO HERE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多