MySQL查询以获取开始日期和结束日期之间的差总和

时间:2019-11-28 11:07:16

标签: mysql

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

+-----------+-----------+
| 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日和19年11月22日之间的差是2天
  • 10-Nov-19和21-Nov-19之间的差是11天,但查询必须将其视为9天,因为第一行已经考虑了20-Nov,21-Nov天。
  • 19-Nov-19和26-Nov-19之间的差值为12天,但是查询必须将其视为4天,因为上面的行中已经考虑了14-Nov至22-Nov天。

查询结果应为

  

15天(2 + 9 + 4)

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我在子查询中使用了窗口函数来计算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')

答案 2 :(得分:0)

您可以使用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