6

我有一个接受两个时间参数的函数:$start_time$end_time 每个参数在 php 中定义为时间

$start_time = date("H:i:s",strtotime($start)); ->like "06:12:44"
$end_time = date("H:i:s",strtotime($end)); ->like "08:22:14"

我想构建一个查询,在这些时间之间给出结果这是我的功能

function statistics_connected_hour($gateway_id , $date_sql ,$start_time ,$end_time){
$statistics_connected = mysql_query(

    "SELECT * 
       FROM cdr_table 
       WHERE OwnerUserID ='$_SESSION[user_id]'
       AND GatewayID = $gateway_id
       AND DATE(Dialed) = $date_sql
       AND Dialed != 0
       AND Hour(StartTime) BETWEEN ('$start_time') AND ('$end_time')
    "); 

return $statistics_connected;
}

数据库中的 StartTime 列定义为“2012-12-28 13:32:28”

查询不返回任何结果,尽管应该返回当我检查时->

$num = mysql_num_rows($statistics_connected);

它总是在 $num 中返回 0

谁能帮我理解问题是什么?

4

2 回答 2

4

你想要TIME(),没有HOUR()

SELECT * FROM cdr_table 
WHERE OwnerUserID = '$_SESSION[user_id]'
  AND GatewayID = $gateway_id
  AND DATE(Dialed) = $date_sql
  AND Dialed != 0
  AND TIME(StartTime) BETWEEN '$start_time' AND '$end_time'

此外,我强烈建议您转义您嵌入 SQL 代码中的所有变量mysql_real_escape_string()或等效变量,即使您确定它们没有任何害处,只是为了养成习惯。

请注意,这样的查询本质上可能效率低下,因为它不能利用StartTime列上的索引。如果表中有很多可能匹配的行,最好通过创建一个存储时间部分的单独列StartTime并在其上设置索引(可能与其他相关列组合)来对表进行非规范化.

于 2012-12-29T21:12:25.567 回答
0

原因是因为您正在提取 HOUR 并与时间进行比较,您需要转换时间部分尝试您的查询:

SELECT 

* 
FROM cdr_table 
WHERE 
OwnerUserID ='$_SESSION[user_id]' 
AND GatewayID = $gateway_id 
AND DATE(Dialed) = $date_sql 
AND Dialed != 0 
AND DATE_FORMAT(StartTime,'%r') BETWEEN ('$start_time') AND ('$end_time')
于 2012-12-29T21:11:05.617 回答