【问题标题】:Count amount of days within timestamps in MySQL table计算 MySQL 表中时间戳内的天数
【发布时间】:2017-10-08 20:47:59
【问题描述】:

假设我有一个包含以下记录的表: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 中是否可行?

【问题讨论】:

  • a 的值应该是 5,而不是 6?
  • 对不起,你是对的,我改例子的时候搞错了

标签: mysql sql datetime group-by


【解决方案1】:

一种可能的解决方案是构建一个“参考表”,其中包含适合您情况的所有可能日期。 (例如,您可以填充未来 20 年和过去 20 年。)对于这个 sqlfiddle,我刚刚填写了必要的日子。我用单个日期列day 创建了ref_dates,并使用了以下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;

【讨论】:

    【解决方案2】:

    如果它们都重叠(如您的示例数据),您可以使用:

    select category, datediff(min(begin), max(end))
    from t
    group by category;
    

    如果有差距,问题就更难了。

    【讨论】:

    • 不,记录不一定重叠,让我在示例数据中解决这个问题
    【解决方案3】:

    我会使用 timestampdiff 并使用一个简单的总和。这将计算以分钟为单位的差异总和,然后根据需要进行转换。

    select category,
    sum(timestampdiff(minute, begin,end)) as 'diff'
    from times
    group by category
    

    【讨论】:

    • 但这并不完全符合我的要求,我想计算不同日期的数量。所以假设我有两条记录 2017-08-10 23:00 - 2017-08-10 23:012017-08-12 11:00 - 2017-08-12 11:01,我希望这些记录为两天,就像两条记录 2017-08-10 01:00 - 2017-08-10 23:002017-08-12 02:00 - 2017-08-12 22:00 一样。
    • 在那种情况下,a 类的结果不应该是 5 吗?是 26/9、27/9、6/10、7/10 和 8/10??
    猜你喜欢
    • 1970-01-01
    • 2014-11-09
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多