我有一个接受两个时间参数的函数:$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任何人都可以帮我理解问题所在吗?
答案 0 :(得分:3)
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')