【问题标题】:MySQL Select : where time is greater then and less than timeMySQL Select:时间大于时间小于时间的地方
【发布时间】:2012-12-29 21:05:35
【问题描述】:

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

谁能帮我理解问题出在哪里?

【问题讨论】:

  • 它不起作用,因为HOUR() 返回一个数字(小时),但您正在与时间字符串进行比较。

标签: mysql between


【解决方案1】:

你想要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 的时间部分并设置索引来对表进行非规范化就可以了(可能与其他相关列结合使用)。

【讨论】:

  • 数据库中的StartTime列定义为“2012-12-28 13:32:28”
  • 我发现了问题:从 Hour 到 Time 的更改有所帮助,但给定参数的值是错误的时间,所以我更改它并解决了问题,谢谢
  • 我无法更改数据库,它来自一个非常复杂的系统,我只能从中读取数据,但无论如何谢谢
【解决方案2】:

原因是因为你在提取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')

【讨论】:

  • 这个我试过了还是不行你可以看上面的功能
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2018-09-29
相关资源
最近更新 更多