6

私は2つの時間パラメータを受け入れる関数を持っています: $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;
}

DB の 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 に答える