2013-04-23 2 views
-1

작업의 시작 시간, 종료 시간 및 빈도가있는 데이터베이스가 있습니다 실행 (everyMinutes).24 시부 터 00시 (00:00:00)가 아닌 23:59:00 미만의 무한 루프를 중지하십시오.

나는이 데이터를 PHP로 가져와 예상 시간을 별도의 테이블에 쓰는 루프를 사용하고있다. 문제는 작업이 00:00:00에서 시작하여 23:59:00에서 끝나는 경우입니다. 기능적으로 이는 하루 종일 실행됨을 의미합니다. everyMinutes이 15이면 00:00:00에서 시작하여 00:00:15에서 다시 실행합니다.

내 코드의 문제는 $latestRunTime$endTime보다 작은 23:45:00이 될 것이므로 다시 반복됩니다. 그러나 루프의 끝에서 $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); 
    } 
} 
+0

를 사용하여 전체 날짜 *와 * 시간, 적어도 당신의 루프하지 않을 경우 데이터베이스에서뿐만 아니라. – Sammitch

+0

불행히도 데이터베이스의 데이터 유형을 제어 할 수 없으며 '시간 (7)입니다. – mhopkins321

+1

if 문을 사용하여 시간이 00:00:00인지 확인하고 변경하는 경우에만 사용할 수 있습니까? 24:00:00? – MatthewMcGovern

답변

2

당신의 while 루프 내부의 마지막 줄이 추가

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

현재 단지 다음 실행 작업이 허용 제한 시간 내에 있는지 확인하기 위해 변경, 확인하고 있습니다.

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

그게 똑같은 문제 야. '('23 : 45 : 00 '<'23 : 59 : 00')'그래서 그것은 실행됩니다. 그리고 다음 번'while ('00 : 00 : 00 '<'23 : 59 : 00 ')은 여전히 ​​사실입니다. 그것은 무한하게 반복합니다 – mhopkins321

+0

나는 초가 경과 한 초가되도록 의도했습니다. 아마도 $ endTime에 반환 값을 오해했을 것입니다. 또한 $ 초를 보완하기 위해 명세서의 왼쪽에 -strtotime ("00:00:00")이 필요합니다. – xert

관련 문제