【问题标题】:SQL calculation for finding time difference查找时差的SQL计算
【发布时间】:2013-03-16 07:24:47
【问题描述】:

我已经使用 (NOW) 函数来获取当前的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 这样如果; waiting_time 超过 3 小时,提示“此患者必须下次见!”。

【问题讨论】:

  • 所以倒转时间得到正值??

标签: mysql sql time date-arithmetic


【解决方案1】:

您的 SQL 语句中所选字段之间缺少逗号。 您正在将时间戳(字符串)与日期进行比较。您需要将字符串转换回日期。

改变这个

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

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

【讨论】:

  • @SF 您还需要将时间戳转换为日期。已更新。
  • 我没有使用 TIMESTAMP,它作为 TIME 插入到 Arrival_Time 表中。我需要实现这个吗?
  • @SF 你说“我已经使用了 (NOW) 功能”。此函数将当前日期和时间作为 'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS.uuuuuu 格式的值返回,具体取决于该函数是在字符串还是数字上下文中使用。 参考dev.mysql.com/doc/refman/5.5/en/…。换句话说,它是一个时间戳:-)。将其转换回 DATE。
  • 我正在使用 NOW 将 TIME 插入表中,但是这个 INSERTS 为 11:16:21(没有日期,只是时间。)这一切都非常令人困惑
  • 太棒了,非常感谢您的帮助,我颠倒了到达时间和当前时间以获得积极的时间。谢谢!
【解决方案2】:

您可以尝试使用CURRENT_TIMECURTIME() 代替NOW()

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

[编辑]
因为NOW()DATETIME,所以不仅仅是时间。 MySQL Doc

[添加]
您可以使用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 值来满足您的所有需求...这里,查询只返回 diff 大于 3 小时的行...

【讨论】:

  • 是的,缺少逗号...现在重试! (我只是通过了你的查询,没有检查它)
  • 因为到达时间正在使用 NOW() 我认为它搞砸了。我已经使用了当前时间,它已经奏效了!但它现在显示--01:13:16
  • 当我尝试这个查询时:SELECT TIMEDIFF(CURTIME() ,CURRENT_TIME) as Waiting_Time 它有效。但是这个SELECT TIMEDIFF(NOW() ,CURRENT_TIME) as Waiting_Time 没有。我认为它只是优化使用 CURRENT_TIME 与另一个 TIME 进行比较......不是吗?
  • @SF 如需更多解释,当您在 INSERT 查询中使用 NOW() 时,数据库会进行 cast 以检索表中 TIMESTAMP 的 TIME 部分,你只得到时间。但是当你不想比较时间时,你会使用 CURRENT_TIME 直接获取一个 TIME 类型。
  • 我将更新这个问题,向您展示我已经实现了什么以及它正在显示什么。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多