Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何根据员工编号和日期对进入和退出时间进行分组_Php_Sql_Database - Fatal编程技术网

Php 我如何根据员工编号和日期对进入和退出时间进行分组

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

[[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 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;