由于24:00:00(00:00:00)小于23:59:00而不是更多,因此停止无限循环

时间:2013-04-23 15:24:23

标签: php datetime loops sql-server-2008-r2 infinite-loop

我有一个数据库,它包含一个任务的startTime,endTime以及它运行的频率(everyMinutes)。

我将这些数据带入php,并使用循环将所有预期时间写入单独的表。问题是当任务从00:00:00开始并在23:59:00结束时。从功能上讲,这意味着它全天运行。如果everyMinutes为15,那么它将从00:00:00开始,然后再次在00:00:15处运行。

以下代码的问题是,$latestRunTime23:45:00小于$endTime,因此会再次进行迭代。但是,不是在循环结束时大于$endTime,而是将其设置回00:00:00并且我陷入无限循环。我该如何缓解这种情况?

$getTaskDetailQuery = "SELECT taskID, startTime, endTime, everyMinutes FROM frequencyTable WHERE everyMinutes != '00:00:00' ORDER BY taskID ASC";
$stmt = sqlsrv_query($conn, $getTaskDetailQuery);
if($stmt === FALSE){
    die(print_r(sqlsrv_errors(), true));
}
$insertQueryMulti = "INSERT INTO exactTimeScheduleTable (taskID, expectedTime) VALUES (?, ?)";
while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)){
    $taskID = $row['taskID'];
    $startTimeRaw = $row['startTime'];
    $endTimeRaw = $row['endTime'];
    $everyMinutesRaw = $row['everyMinutes'];
    $startTime = $startTimeRaw->format('H:i:s');
    $endTime = $endTimeRaw->format('H:i:s');
    $everyMinutes = $everyMinutesRaw->format('H:i:s');
    $secs = strtotime($everyMinutes)-strtotime("00:00:00");
    $latestRunTime = date("H:i:s",strtotime($startTime));
    while ($latestRunTime < $endTime){
        $timeToInsertRaw = strtotime($latestRunTime);
        $dataForInsert = array($taskID,$latestRunTime);
        $execute = sqlsrv_query($conn, $insertQueryMulti, $dataForInsert);
        $latestRunTime = date("H:i:s",strtotime($latestRunTime)+$secs);
    }
}

2 个答案:

答案 0 :(得分:2)

只需将其添加为while循环中的最后一行:

if($latestRunTime == "00:00:00") break;

答案 1 :(得分:0)

您目前正在检查上次运行操作是否在可接受的时间限制内,只需更改它以检查 next 运行操作是否在接受的时间限制内

while (strtotime($latestRunTime)+$secs < $endTime);