Php 我如何根据员工编号和日期对进入和退出时间进行分组
[[2]我尝试获取考勤表数据(包括emp_编号、日期、时间)。我希望将上面的表日期插入为emp_编号、日期、时间和超时。时间逻辑如下所示 我尝试sql查询Php 我如何根据员工编号和日期对进入和退出时间进行分组,php,sql,database,Php,Sql,Database,[[2]我尝试获取考勤表数据(包括emp_编号、日期、时间)。我希望将上面的表日期插入为emp_编号、日期、时间和超时。时间逻辑如下所示 我尝试sql查询 SELECT EnrolledID, Date, CASE WHEN Time > '1899-12-30 03:00:00' && Time <= '1899-12-30 12:15:00' THEN Time END AS t
SELECT
EnrolledID,
Date,
CASE WHEN Time > '1899-12-30 03:00:00' && Time <= '1899-12-30 12:15:00' THEN Time
END AS time_in ,
CASE WHEN Time > '1899-12-30 12:15:00' && Time <= '1899-12-30 23:59:59' THEN Time
END AS time_out
from attendance
GROUP BY EnrolledID,Date
预期产出
EnrolledID Date time_in time_out
23 2019-08-01 00:00:00 1899-12-30 07:54:40 1899-12-30 16:01:40
23 2019-08-01 00:00:00 1899-12-30 07:42:35 1899-12-30 16:01:40
23 2019-08-02 00:00:00 1899-12-30 07:42:35 1899-12-31 16:15:33
23 2019-08-02 00:00:00 1899-12-30 07:11:51 1899-12-30 16:02:53
23 2019-08-03 00:00:00 1899-12-30 07:37:41 1899-12-31 16:15:00
如何解决此问题?如何避免出现空值?您的示例结果没有意义。您有关于
23
/'2019-08-01'
的副本,但我看不到支持此类副本的数据
我怀疑您真正想要的是聚合,比如:
SELECT EnrolledID, Date,
MIN(Time) as time_in,
NULLIF(MAX(Time), MIN(Time)) as time_out
FROM attendance
GROUP BY EnrolledID, Date;
这假设每个报名者每个日期最多两行。无需担心1899-12-31欢迎,为了提高您的体验,请阅读,和以及如何创建不是编码部分。它只显示确定时间输入和时间输出的时间范围是。我试着用3天的时间来解决这个问题。但是当把数据分组时,一个值的数据会丢失。吸引有知识的志愿者并获得快速、高质量的解决方案的最好方法是生成一个完整的dbfiddle演示链接,其中有足够的样本数据来重现这个问题,并在其中显示失败的查询。我们看到你预期的结果集,所以部分做得很好。它工作但有小问题。在下一个数据之间可能会出现超时时间,在0:00时和03:00之间也应该考虑时间超时,非常感谢你如何管理以上条件?(时间>='00:00:00'&时间<'03:00:00')必须标识为前一天的超时
SELECT EnrolledID, Date,
MIN(Time) as time_in,
NULLIF(MAX(Time), MIN(Time)) as time_out
FROM attendance
GROUP BY EnrolledID, Date;