Mysql - 分组在30分钟内的开始和结束时间

时间:2015-06-22 16:48:18

标签: mysql group-by

我试图将员工的时间总结为我们的计时申请,如果开始和结束时间相同或者在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 个答案:

答案 0 :(得分:0)

很抱歉,这不是group by指令的目的。无论您使用的语言是什么,我都建议您使用mysql。

如果您必须在mysql上执行此操作,请记住的解决方案需要进行一些更改:

  • 建立触发器的另一列生成了ID,然后将其称为shift_id
  • 该表上与post和update事件关联的触发器,用于检查发布/更新的行与同一员工的最后一次迭代之间的时差,然后将shift_id设置为与上一次迭代相同或一个新的自动生成的。

这样做需要的工作量远远超过在应用程序代码中查找的工作量。