Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在sql中计算每月的总天数_Mysql_Sql - Fatal编程技术网

Mysql 在sql中计算每月的总天数

Mysql 在sql中计算每月的总天数,mysql,sql,Mysql,Sql,我有一个多列的表,其中两列是开始日期和结束日期 我需要计算每个月的天数。假设我的表中有以下数据 id | start_date | end_date 1 04.01.2016 15.02.2016 2 07.01.2016 22.01.2016 3 16.05.2016 11.07.2016 我想要一个如下的输出 Month | numberOfTravelDays January 51 February

我有一个多列的表,其中两列是开始日期和结束日期

我需要计算每个月的天数。假设我的表中有以下数据

id | start_date | end_date    
1    04.01.2016   15.02.2016    
2    07.01.2016   22.01.2016    
3    16.05.2016   11.07.2016
我想要一个如下的输出

Month |   numberOfTravelDays    
January     51    
February    15     
May         15
June        31    
July        11
我期望的输出是每月已利用的总旅行天数。为此构造sql查询时遇到问题。有人能帮我吗

这就是我现在所拥有的。而且它不起作用。下面的查询也只过滤今年的记录(但忽略这一点)

使用派生表:

select monstart,
       sum(datediff(least(m.monend, t.end_date) + interval 1 day,
                    greatest(m.monstart, t.start_date)
                   )
           ) as days_worked
from travel t join
     (select date('2016-01-01') as monstart, date('2016-01-31') as monend union all
      select date('2016-02-01') as monstart, date('2016-02-29') as monend union all
      . . .
     ) m
     on t.end_date >= m.monstart and t.start_date <= m.monend
group by monstart;
选择monstart,
总和(datediff(至少(m.monend,t.end_date)+间隔1天,
最大(m.monstart,t.start\u日期)
)
)在你工作的日子里
来自旅行社,请不要加入
(选择日期('2016-01-01')作为monstart,选择日期('2016-01-31')作为monend union all
选择日期('2016-02-01')作为monstart,选择日期('2016-02-29')作为monend union all
. . .
)m

在t.end_date>=m.monstart和t.start_date非常感谢您的帮助。我会试试这个然后回来你已经把monstart和monend硬编码了。我必须将年份作为参数传递给此查询。那样的话,这就行不通了right@DesirePRG . . . 只需扩展派生表以包括您关心的所有年份(或者更好,但这些年份在实际表中),并使用
where
子句选择您想要的年份。为什么这些字段不是实际日期时间“YYYY-MM-DD”?是的,它们是实际日期时间,尽管在我的示例数据中不明显有一个编辑按钮
select monstart,
       sum(datediff(least(m.monend, t.end_date) + interval 1 day,
                    greatest(m.monstart, t.start_date)
                   )
           ) as days_worked
from travel t join
     (select date('2016-01-01') as monstart, date('2016-01-31') as monend union all
      select date('2016-02-01') as monstart, date('2016-02-29') as monend union all
      . . .
     ) m
     on t.end_date >= m.monstart and t.start_date <= m.monend
group by monstart;