计算MySQL表中时间戳内的天数

时间:2017-10-08 20:47:59

标签: mysql sql datetime group-by

假设我有一张包含以下记录的表: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中吗?

3 个答案:

答案 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