假设我有一张包含以下记录的表:SQL Fiddle
| category | begin | end |
|----------|---------------------|---------------------|
| a | 2017-09-26 08:00:00 | 2017-09-27 10:00:00 |
| b | 2017-10-02 13:00:00 | 2017-10-03 07:00:00 |
| a | 2017-10-06 02:00:00 | 2017-10-06 09:00:00 |
| a | 2017-10-06 11:00:00 | 2017-10-06 14:00:00 |
| a | 2017-10-06 19:00:00 | 2017-10-08 10:00:00 |
我希望能够计算每个类别的不同日期总数(在开始和结束之间)。因此:a类包含9月26日至27日和10月6日至8日(10月6日显示多个记录),b类仅包含10月2日至3日。因此,我希望得到以下结果:
| category | days |
|----------|------|
| a | 5 |
| b | 2 |
来自某些GROUP BY category
声明。这可能在(My)SQL中吗?
答案 0 :(得分:1)
一种可能的解决方案是构建一个“参考表”,其中包含您所处情况的所有可能日期。 (例如,你可以将这20年放到未来,20年过去。)对于这个sqlfiddle,我刚刚填写了必要的日子。我使用单个日期列ref_dates
创建了day
,并使用了以下sql:
select category,
count(distinct day)
from times
inner join ref_dates
on cast(begin as date) <= day
and day <= cast(end as date)
group by category;
答案 1 :(得分:0)
如果它们全部重叠(如示例数据中所示),则可以使用:
select category, datediff(min(begin), max(end))
from t
group by category;
如果存在差距,问题就更难了。
答案 2 :(得分:0)
我会使用timestampdiff并使用简单的总和。这将计算您可以根据需要进行转换的差异总和(以分钟为单位)。
select category,
sum(timestampdiff(minute, begin,end)) as 'diff'
from times
group by category