Mysql - Group By 30 分钟内的开始和结束时间

Posted

技术标签:

【中文标题】Mysql - Group By 30 分钟内的开始和结束时间【英文标题】:Mysql - Group By start and end times within 30 minutes 【发布时间】:2015-06-22 16:48:17 【问题描述】:

我正在尝试从我们的计时应用程序中总结员工的休假时间,如果开始时间和结束时间相同或在 30 分钟内,我需要合并记录。

这是我的数据的样子:

First_Name    Start_Date             End_Date
EmployeeA     2015-07-23 08:00:00    2015-07-23 16:30:00
EmployeeB     2015-07-23 12:00:00    2015-07-23 08:00:00
EmployeeC     2015-08-20 08:00:00    2015-08-20 10:15:00
EmployeeC     2015-08-20 10:15:00    2015-08-20 12:00:00
EmployeeC     2015-08-20 12:30:00    2015-08-20 16:30:00
EmployeeD     2015-08-22 08:00:00    2015-08-22 10:15:00
EmployeeD     2015-08-22 16:00:00    2015-08-22 16:30:00

在上面的示例中,我希望我的输出如下所示:

First_Name    Start_Date             End_Date
EmployeeA     2015-07-23 08:00:00    2015-07-23 16:30:00
EmployeeB     2015-07-23 12:00:00    2015-07-23 08:00:00
EmployeeC     2015-08-20 08:00:00    2015-08-20 16:30:00
EmployeeD     2015-08-22 08:00:00    2015-08-22 09:00:00
EmployeeD     2015-08-22 16:00:00    2015-08-22 16:30:00

基本上任何结束时间在 30 分钟内或等于同一员工的另一条记录的开始时间的记录都应将条目分组。

到目前为止,我所拥有的是一个组合记录,如果有时间在 24 小时内,但这将组合我的示例中的记录 EmployeeD,这不是我的意图。

select a.first_name, start_date, max(end_date)
from timeoff
group by unix_timestamp(start_date) DIV 17200, first_name

我认为我需要在按功能分组中同时使用开始时间和结束时间,但在确定如何使用时需要帮助。

感谢您的帮助。

【问题讨论】:

听起来你的系统坏了! 【参考方案1】:

抱歉,这不是 group by 指令的目的。我建议在您与 mysql 一起使用的任何语言上执行此操作。

如果您必须在 mysql 上执行此操作,那么想到的解决方案将需要一些更改:

另一列用于建立触发器生成的 id 以进行分组,我们称之为shift_id。 该表上的触发器与发布和更新事件相关联,以检查被发布/更新的行与同一员工的最后一次迭代之间的时间差,然后将shift_id 设置为与上一次迭代或新的相同自动生成的。

这样做比在应用程序的代码中简单地寻找它需要更多的工作。

【讨论】:

FWIW,我不同意这个评估。 请详细说明。你不同意哪一部分?以及为什么。 虽然 GROUP BY 可能不合适,但 MySQL 完全有能力处理此任务,无需更改架构。 你有什么建议草莓来完成我需要的吗?如果 GROUP BY 不够用,我愿意尝试任何其他方法。

以上是关于Mysql - Group By 30 分钟内的开始和结束时间的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL group by 当大于 X

mysql max() datediff() group by

简单的 MySQL 5.7 only_full_group_by 计数

mysql使用带有子查询的临时表,但不是group by和order by

MySql select - group By 很不爽?

php写的mysql查询30分钟内的文章命令应该怎么写呢?