我有一个函数接受两个时间参数:$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谁能帮我弄明白问题是什么吗?您要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
的时间部分,并在其上设置索引(可能与其他相关列结合)。
原因是您正在提取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')