Расчет SQL для нахождения разницы во времени

Я использовал функцию (СЕЙЧАС), чтобы получить текущий TIME и вставить в базу данных как «Время прибытия».

Это показано ниже:

$sql="INSERT INTO Time(Arrival_Time)
VALUES(NOW())";

Тип - это время и вставки как;

12:17:29

Мне нужно рассчитать время ожидания (текущее время - время прибытия);

Пример: Текущее время (13:15) Время прибытия (12:15)

Таким образом, это будет отображать:

Waiting time 
1 hour 

Вот решения, которые я пробовал;

<?php

$conn = mysqli_connect("localhost","root","") or die ("No connection");
mysqli_select_db($conn, "a&e") or die('Could not select database.');

$query = "SELECT Arrival_time, TIMEDIFF(Arrival_time,NOW()) as Waiting_Time FROM Time";
$result = mysqli_query($conn, $query) or die("Invalid query");

echo "<table border='1'>
<tr>
<th>Waiting Time</th>
</tr>";

while ($row = $result->fetch_object()){

 echo "<tr>
  <td>" . $row->Waiting_Time . "</td>
  </tr>";

}

echo "</table>";
mysqli_close($conn);
?>

РЕДАКТИРОВАТЬ

$query = "SELECT Arrival_time, TIME_FORMAT(ABS(TIMEDIFF(CURTIME(), Arrival_time)),'%H hours') as Waiting_Time FROM Time";";

Отображение

Waiting time 
3 hours 

Как бы я использовал time, чтобы if; ожидание_время превышает 3 часа, предупреждение «Этот пациент должен быть осмотрен следующим!».


person S F    schedule 26.03.2013    source источник
comment
Итак, поверните время, чтобы получить положительное значение??   -  person Sepster    schedule 26.03.2013


Ответы (2)


Вы можете попробовать использовать CURRENT_TIME или CURTIME() вместо NOW() :

SELECT Arrival_time, TIMEDIFF(Arrival_time,CURRENT_TIME) as Waiting_Time FROM Time;

[EDIT]
Поскольку NOW() – это DATETIME, это не просто время. Документ по MySQL

[ДОБАВИТЬ]
Вы можете использовать TIME_FORMAT(time_diff, '%H hours'), чтобы получить часы.
Чтобы удалить -, добавьте метод ABS() для получения абсолютного значения:

SELECT Arrival_time, TIME_FORMAT(ABS(TIMEDIFF(Arrival_time,CURRENT_TIME)),'%H hours') as Waiting_Time FROM Time;

[Изменить возвращаемое значение, если timediff > 3]

SELECT Arrival_time, TIME_FORMAT(ABS(TIMEDIFF(Arrival_time,CURRENT_TIME)),'%H hours left') as Waiting_Time FROM Time WHERE CAST(TIME_FORMAT(ABS(TIMEDIFF(Arrival_time,CURRENT_TIME)),'%H') as UNSIGNED INTEGER)>3

Вы можете сделать все, что хотите, со значением timediff... Здесь запрос просто возвращает строки с разницей более 3 часов...

person JoDev    schedule 26.03.2013
comment
ДА, запятая пропущена... Повторите попытку! (Я бы просто пропустил ваш запрос, не проверив его) - person JoDev; 26.03.2013
comment
потому что время прибытия использует NOW(), я думаю, что это испортилось. Я использую ТЕКУЩЕЕ ВРЕМЯ, которое сработало! но теперь отображается --01:13:16 - person S F; 26.03.2013
comment
Когда я пробую этот запрос: SELECT TIMEDIFF(CURTIME() ,CURRENT_TIME) as Waiting_Time он работает. Но этот SELECT TIMEDIFF(NOW() ,CURRENT_TIME) as Waiting_Time нет. Я думаю, что он просто оптимизирован для использования CURRENT_TIME для сравнения с другим TIME... не так ли? - person JoDev; 26.03.2013
comment
@SF Для получения дополнительных пояснений: когда вы используете NOW() в запросе INSERT, база данных выполняет приведение для извлечения части TIME TIMESTAMP, поэтому в таблице вы получаете только TIME. Но когда вы не хотите сравнивать время, вы будете использовать CURRENT_TIME, чтобы напрямую получить тип TIME. - person JoDev; 26.03.2013
comment
Я обновлю вопрос, чтобы показать вам, что я реализовал и что он отображает. - person S F; 26.03.2013
comment
Не знаю, почему, но ВЫБЕРИТЕ время прибытия, TIME_FORMAT(ABS(TIMEDIFF(Arrival_time,CURRENT_TIME)),'%H hours') as Waiting_Time FROM Time; не работает? - person S F; 26.03.2013
comment
Можете ли вы поставить Arrival_time, когда он не работает? Я только что попробовал SELECT TIME_FORMAT(ABS(TIMEDIFF('10:10:10',CURRENT_TIME)),'%H hours') as Waiting_Time;, и он отлично работает... - person JoDev; 26.03.2013
comment
Я заработал. Как бы я использовал эту функцию для оповещения, если время превышает определенное значение; Например; 3 часа? - person S F; 26.03.2013
comment
Спасибо, но мне просто нужна простая функция для оповещения; так что если время › 3 часа; затем следует осмотреть бодрствующего пациента. - person S F; 26.03.2013

В операторе SQL отсутствует запятая между выбранными полями. Вы сравниваете временную метку (строку) с датой. Вам нужно вернуть строку на сегодняшний день.

Изменить это

SELECT Arrival_time TIMEDIFF(Arrival_time,NOW()) as Waiting_Time FROM Time

To

SELECT Arrival_time, TIMEDIFF(DATETIME(Arrival_time),NOW()) as Waiting_Time FROM Time
person Sepster    schedule 26.03.2013
comment
@SF, вам также нужно указать отметку времени на дату. Обновлено. - person Sepster; 26.03.2013
comment
Я не использовал TIMESTAMP, он вставляется как TIME в таблицу Arrival_Time. Мне нужно реализовать это? - person S F; 26.03.2013
comment
@SF, ты сказал, что я использовал функцию (СЕЙЧАС). Эта функция возвращает текущую дату и время в виде значения в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС» или ГГГГММДДЧЧММСС.уууууу, в зависимости от того, используется ли функция в строковом или числовом контексте. обратитесь к dev.mysql.com/ doc/refman/5.5/ru/. Другими словами, это временная метка :-). Вернуть его к DATE. - person Sepster; 26.03.2013
comment
Я использую СЕЙЧАС, чтобы ВСТАВИТЬ ВРЕМЯ в таблицу, но это ВСТАВЛЯЕТ как 11:16:21 (без даты, только время). Все это очень запутанно - person S F; 26.03.2013
comment
круто, большое спасибо за вашу помощь, я поменял время прибытия и текущее время, чтобы получить положительное время. Спасибо! - person S F; 26.03.2013