【问题标题】:Sum the total time periods over a given day in MySQL [closed]总结MySQL中给定一天的总时间段[关闭]
【发布时间】:2013-08-03 06:33:59
【问题描述】:

我需要对以下内容进行 MySQL 查询。我有一个如下的时间段表:

`active_periods`
+----+--------+---------+------------+------------+
| Id |   Day  | All Day | Start Time |  End Time  |
+----+--------+---------+------------+------------+
| 1  | Friday |    0    |  18:00:00  |  22:00:00  |
 ---- -------- --------- ------------ ------------
| 2  | Friday |    0    |  06:00:00  |  13:00:00  |
 ---- -------- --------- ------------ ------------
 INT  VARCHAR  TINYINT   TIME         TIME

使用 MySQL 查询,我需要能够计算这些时间段并返回 星期五 当天这些给定时间段之间 15 分钟块 的数量.所以从上表中我会得到44 15 分钟块的答案。

提前致谢。

【问题讨论】:

  • 您能否提供更多数据,例如您的字段是什么数据类型?

标签: php mysql sql laravel laravel-4


【解决方案1】:

你在寻找这样的东西吗?

SELECT SUM(TIME_TO_SEC(TIMEDIFF(end_time, start_time)) / 60 / 15) total
  FROM active_periods
 WHERE day = 'Friday'

输出:

|总计 | --------- | 44 |

这里是SQLFiddle演示

【讨论】:

  • 不,这仅返回第一个时间段的总和。我需要它来总结两个时间段。正如我所说,上表中我想要的结果是 44 而不是 16。
  • 当我将结束时间值 13:00 更改为 15:00 时,这是一个错误查询,然后结果为 52,这是不正确的。
  • @Stewi 你想详细说明一下吗?你看我提供的 sqlfiddle 例子和输出了吗???它是 44。它确实会计算每个时间段的 15 分钟块数并将其相加。
  • @BrokenHeartღ 怎么回事?你愿意解释吗? 15:00 和 13:00 之间的时间差是 +2 小时,即 8 个 15 分钟块。 44 + 8 = 52。这里是sqlfiddle
  • @peterm,我不在乎 OP 是否接受你的回答。对我来说,这是正确的。 +1
【解决方案2】:

这将返回日期和 15 分钟块的数量(作为浮点数)。

SELECT `Day`, SUM(TIME_TO_SEC(TIMEDIFF(`End Time`, `Start Time`)) / 60 / 15) AS `Periods` 
FROM `active_periods`
GROUP BY `Day`

例如:

| Day    | Periods     |
------------------------
| Friday | 44.00000000 |

【讨论】:

  • 您确定两条记录的 Day 字段值相同吗?我的猜测是你有尾随空格或其他东西。尝试运行 SELECT MD5(Day) FROM active_periods;并查看所有行返回的哈希是否相同
【解决方案3】:
select sum( end_time - start_time ) / 900 from active_periods where day= 'Friday'

【讨论】: