MySQL选择:时间大于时间且小于时间

时间:2012-12-29 21:05:36

标签: mysql between

我有一个接受两个时间参数的函数:$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

任何人都可以帮我理解问题所在吗?

2 个答案:

答案 0 :(得分:3)

您需要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'

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

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

答案 1 :(得分: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')