Php MySQL-更改一行的时间值以匹配同一表中另一行的时间值

Php MySQL-更改一行的时间值以匹配同一表中另一行的时间值,php,mysql,mysqli,Php,Mysql,Mysqli,我有几位顾问记录他们的工作开始/结束时间。因为他们有两小时的最低费用,我需要确保我正确计算他们的工作时间。当它们在同一站点上有连续作业时,问题就会出现,两个作业之间的空闲时间介于15到60分钟之间 下面是按cid、作业日期、开始时间排序的示例表的查询结果。对于此特定示例,所有作业时间条目均为同一天: id job_num cid job_date start_time end_time 19 130513-20 6 05/13/2013 2013-

我有几位顾问记录他们的工作开始/结束时间。因为他们有两小时的最低费用,我需要确保我正确计算他们的工作时间。当它们在同一站点上有连续作业时,问题就会出现,两个作业之间的空闲时间介于15到60分钟之间

下面是按cid、作业日期、开始时间排序的示例表的查询结果。对于此特定示例,所有作业时间条目均为同一天:

 id  job_num    cid job_date    start_time           end_time
 19  130513-20  6   05/13/2013  2013-05-13 13:30:00  2013-05-13 16:30:00
 10  130513-10  7   05/13/2013  2013-05-13 11:00:00  2013-05-13 13:00:00
 16  130513-17  13  05/13/2013  2013-05-13 14:45:00  2013-05-13 15:30:00
 15  130513-16  16  05/13/2013  2013-05-13 14:45:00  2013-05-13 16:15:00
 18  130513-19  34  05/13/2013  2013-05-13 11:15:00  2013-05-13 12:15:00
 8   130513-08  44  05/13/2013  2013-05-13 12:00:00  2013-05-13 14:30:00
 6   130513-06  47  05/13/2013  2013-05-13 11:00:00  2013-05-13 12:00:00
 9   130513-09  47  05/13/2013  2013-05-13 12:00:00  2013-05-13 12:30:00
 14  130513-15  47  05/13/2013  2013-05-13 14:30:00  2013-05-13 15:15:00
 3   130513-03  50  05/13/2013  2013-05-13 09:00:00  2013-05-13 10:45:00
 7   130513-07  50  05/13/2013  2013-05-13 11:00:00  2013-05-13 12:00:00
 11  130513-11  50  05/13/2013  2013-05-13 13:00:00  2013-05-13 14:30:00
 17  130513-18  50  05/13/2013  2013-05-13 15:00:00  2013-05-13 16:15:00
 2   130513-02  52  05/13/2013  2013-05-13 09:30:00  2013-05-13 10:30:00
 4   130513-04  52  05/13/2013  2013-05-13 10:30:00  2013-05-13 11:00:00
 5   130513-05  52  05/13/2013  2013-05-13 11:00:00  2013-05-13 13:00:00
 12  130513-12  52  05/13/2013  2013-05-13 14:00:00  2013-05-13 14:45:00
 13  130513-13  52  05/13/2013  2013-05-13 15:00:00  2013-05-13 17:00:00
 20  130513-21  61  05/13/2013  2013-05-13 11:00:00  2013-05-13 12:00:00
 1   130513-01  70  05/13/2013  2013-05-13 14:30:00  2013-05-13 15:15:00

我试图完成的是更新特定行的结束时间(job_num),使其等于同一顾问(cid)查询中下一个job_num的结束时间,但前提是差异(空闲时间)在第一个作业的结束时间和下一个作业的开始时间之间我假设
id
是表的
主键,并且它是
自动递增的

我有这个
更新
查询:

UPDATE table T1
    SET T1.end_time = (
            SELECT T2.end_time
                FROM table T2
                WHERE T2.cid = T1.cid
                    AND T2.job_date = T1.job_date
                    AND T2.id > T1.id
                    AND T2.start_time <= DATE_ADD(T1.end_time, INTERVAL 30 MINUTE)
                ORDER BY T2.id ASC
                LIMIT 1
        )
    WHERE id IN (
        SELECT DISTINCT T1.Id
            FROM table T1
            INNER JOIN table T2 ON T2.cid = T1.cid
                AND T2.job_date = T1.job_date
                AND T2.id > T1.id
                AND T2.start_time <= DATE_ADD(T1.end_time, INTERVAL 30 MINUTE)
            WHERE T1.job_date = @date
        );
DECLARE id INT(11);
DECLARE newEndDate DATETIME;

DECLARE noMoreRows BIT(1);
DECLARE customCursor CURSOR FOR
    SELECT T1.Id
        , CAST(SUBSTRING_INDEX(GROUP_CONCAT(T2.start_date ORDER BY T2.Id ASC), ',', 1) AS DATETIME) AS NewEndDate
        FROM table T1
        INNER JOIN table T2 ON T2.cid = T1.cid
             AND T2.job_date = T1.job_date
             AND T2.id > T1.id
             AND T2.start_time <= DATE_ADD(T1.end_time, INTERVAL 30 MINUTE)
        WHERE T1.job_date = @date
        GROUP BY T1.Id
        HAVING NewEndDate <> '' OR NewEndDate IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET noMoreRows = 1;

OPEN customCursor;
customLoop: LOOP

    FETCH customCursor INTO id, newEndDate;

    IF noMoreRows THEN
      LEAVE customLoop;
   END IF;

    UPDATE table
        SET end_date = newEndDate
        WHERE id = id;

END LOOP customLoop;
CLOSE customCursor;

请注意,
游标
应该位于
存储过程
中。以下是
游标的格式

我假设您正在使用php格式化开始时间和结束时间,然后插入到数据库表中

$start = date("Y-m-d H:i:s",time());
$query = "select * from table name where cid = $cid and  UNIX_TIMESTAMP($start) - UNIX_TIMESTAMP(end_time) <= 1800";
mysqli_query($con,$query);

if ($result=mysqli_query($con,$query))
  {
    $rowcount=mysqli_num_rows($result);

    if($rowcount > 1)
    { 
     $row = mysqli_fetch_array($result, MYSQLI_ASSOC);

     query2 = "update tablename set end_time = '$start' where id = '$row['id']'";

     query3 = "insert into tablename(cid,date,start_time,end_time) values($cid,$date,$start,$end)";


    }else{

    //do the insert as such
    query2 = "insert into tablename(cid,date,start_time,end_time) values($cid,$date,$start,$end)";

    }

    mysqli_free_result($result);
  }
$start=date(“Y-m-dh:i:s”,time());

$query=“select*from table name where cid=$cid和UNIX\u TIMESTAMP($start)-UNIX\u TIMESTAMP(end\u time)如果要使用
UPDATE
查询,只需首先在备份表上测试它。非常感谢您,凯尔!我将测试它并让您知道。where子句中的查询错误“job\u date”列不明确“我相信我会找到答案的。同时,根据你的建议,我正在阅读关于库苏尔的文章。谢谢约翰!脚本比较一行的开始/结束时间。在我的示例数据中,我很难弄清楚如何比较第3行的结束时间和第7行的开始时间。如果3.end和7.start之间的差值小于30分钟(1800),则3.end将使用7.start的值进行更新。正如您在我的示例查询中所看到的,虽然id是主键并且是自动递增的(这证实了@KaeL的假设),但并不是所有的工作条目都是按顺序记录的,这就是为什么我按顾问(cid)对它们进行分组,然后按开始时间对它们进行排序的原因。当创建新条目时,我采用开始时间(插入)并查找与已插入的
结束时间的差异。找出与cid(待插入)匹配的每一行的差异。如果发现有30分钟(等于或小于30分钟)的差异,则匹配记录
end_time
将用开始时间(待插入)更新。然后插入新条目。这就是你要找的吗?谢谢你的解释,约翰!现在更有意义了!我会试试看,让你知道它是怎么回事。
DECLARE id INT(11);
DECLARE newEndDate DATETIME;

DECLARE noMoreRows BIT(1);
DECLARE customCursor CURSOR FOR
    SELECT T1.Id
        , CAST(SUBSTRING_INDEX(GROUP_CONCAT(T2.start_date ORDER BY T2.Id ASC), ',', 1) AS DATETIME) AS NewEndDate
        FROM table T1
        INNER JOIN table T2 ON T2.cid = T1.cid
             AND T2.job_date = T1.job_date
             AND T2.id > T1.id
             AND T2.start_time <= DATE_ADD(T1.end_time, INTERVAL 30 MINUTE)
        WHERE T1.job_date = @date
        GROUP BY T1.Id
        HAVING NewEndDate <> '' OR NewEndDate IS NOT NULL;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET noMoreRows = 1;

OPEN customCursor;
customLoop: LOOP

    FETCH customCursor INTO id, newEndDate;

    IF noMoreRows THEN
      LEAVE customLoop;
   END IF;

    UPDATE table
        SET end_date = newEndDate
        WHERE id = id;

END LOOP customLoop;
CLOSE customCursor;
$start = date("Y-m-d H:i:s",time());
$query = "select * from table name where cid = $cid and  UNIX_TIMESTAMP($start) - UNIX_TIMESTAMP(end_time) <= 1800";
mysqli_query($con,$query);

if ($result=mysqli_query($con,$query))
  {
    $rowcount=mysqli_num_rows($result);

    if($rowcount > 1)
    { 
     $row = mysqli_fetch_array($result, MYSQLI_ASSOC);

     query2 = "update tablename set end_time = '$start' where id = '$row['id']'";

     query3 = "insert into tablename(cid,date,start_time,end_time) values($cid,$date,$start,$end)";


    }else{

    //do the insert as such
    query2 = "insert into tablename(cid,date,start_time,end_time) values($cid,$date,$start,$end)";

    }

    mysqli_free_result($result);
  }