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;