簡體   English   中英

MySQL-更改一行的時間值以匹配同一表的另一行的時間值

[英]MySQL - change time values of one row to match time values of another row of the same table

我有幾位顧問記錄他們的工作開始/結束時間。 因為他們有兩個小時的最低收費,所以我需要確保正確計算他們的工作時間。 當他們在同一站點上有連續的作業,而作業之間的空閑時間介於15到60分鍾之間時,就會出現問題。

以下是按cid,job_date,start_time排序的示例表的查詢結果。 對於此特定示例,所有作業時間條目都在同一天:

 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)的end_time,以使其等於同一顧問(cid)的查詢中下一個job_num的end_time,但前提是兩者之間存在差異(空閑時間)從第一個作業的結束時間到下一個作業的開始時間之間的時間<= 30分鍾。 基本上,我想在比較中將空閑時間添加到第一個作業的end_time中。

例如:

 id  job_num    cid job_date    start                end                
 3   130513-03  50  05/13/2013  2013-05-13 09:00:00  2013-05-13 10:45:00  <-- original
 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  <-- original
 17  130513-18  50  05/13/2013  2013-05-13 15:00:00  2013-05-13 16:15:00 
...
 12  130513-12  52  05/13/2013  2013-05-13 14:00:00  2013-05-13 14:45:00  <-- original
 13  130513-13  52  05/13/2013  2013-05-13 15:00:00  2013-05-13 17:00:00 

成為:

 3   130513-03  50  05/13/2013  2013-05-13 09:00:00  2013-05-13 11:00:00  <-- changed
 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 15:00:00  <-- changed
 17  130513-18  50  05/13/2013  2013-05-13 15:00:00  2013-05-13 16:15:00 
...
 12  130513-12  52  05/13/2013  2013-05-13 14:00:00  2013-05-13 15:00:00  <-- changed
 13  130513-13  52  05/13/2013  2013-05-13 15:00:00  2013-05-13 17:00:00 

我將如何進行此更改? 我已經看到了使用臨時表和變量來解決類似問題的解決方案,這些臨時表和變量非常適合檢查時差,但都不能(根據我對MySQL查詢的了解)適應我的特定問題。 我也將此問題標記為PHP,因為用PHP這樣做可能會更簡單。

任何幫助將不勝感激!

我假設id是表的Primary Key ,並且是AUTO-INCREMENT ing。

我有此UPDATE查詢:

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

雖然有點復雜,但效率不高。 但是由於這只是一個查詢,我想您將需要每次(每天/每周/等等)更新end_time

並確保設置@date變量的值,或者可以將其替換為所需的日期。

我認為使用CURSOR (這很慢)比上面的查詢更有效。

這是一個CURSOR查詢示例:

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;

只需注意CURSOR應該在STORED PROCEDURE 這是CURSORS鏈接

我假設您正在使用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);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM