为什么我的MySQL BETWEEN运算符不能正常工作?

时间:2013-10-09 09:26:51

标签: php mysql

MySQL表“flightSched”连接到时间,类似于下面的那个:

flightNo    |day    |time   |arrivalTimeSec
=============================================
WERE112 |Tuesday    | 1:00  |1381186800
FGHG234 |Tuesday    |23:00  |1381266000
CGHF345 |Tuesday    |00:00  |1381183200

我有一个mysql查询,可以选择两次之间的所有数据。这是查询:

$CurrentTimeMinus30min = date('H:i', strtotime('-30 minutes')); //Current Time minus 30minutes
$CurrentTimeMinus30min = strtotime($CurrentTimeMinus30min);     

$CurrentTimePlus4Hours = date('H:i', strtotime('+240 minutes')); //Current Time plus 4 hours
$CurrentTimePlus4Hours = strtotime($CurrentTimePlus4Hours);

$query = $mysqli->query("
    SELECT * FROM flightSched 
    WHERE day = '$currentDay' 
    AND arrivalTimeSec 
        BETWEEN '$CurrentTimeMinus30min' 
        AND '$CurrentTimePlus4Hours'
");

我被建议在时间值上使用strtotime()函数,以便能够在BETWEEN MySQL查询中使用它们。这似乎根本不起作用。

这个查询我哪里错了?任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

今天我发现了你的问题(我的坐标问题)。 我发现在某些情况下,BETWEEN运算符只能像这样使用

..... WHERE columname BETWEEN smallervalue AND biggervalue
之前我曾尝试使用较大的值,因为我处理了负数,但它失败了。 您可能会在时间戳中发现同样的问题。

答案 1 :(得分:0)

strtotime返回一个时间戳,因此将其传递给MySQL查询,如上所述,将无效。请尝试使用FROM_UNIXTIME

$query = $mysqli->query("SELECT * FROM flightSched 
                    WHERE day = '$currentDay' 
                    AND FROM_UNIXTIME(arrivalTimeSec) BETWEEN FROM_UNIXTIME($CurrentTimeMinus30min) AND FROM_UNIXTIME($CurrentTimePlus4Hours) " );

编辑 - 我没有注意到arrivalTimeSec也是时间戳。以上可能不是一个可行的答案,但尝试一下。如果它不起作用,正如其他人所说,定义你的意思

  

这似乎根本不起作用。

它没有返回任何行吗?它返回错误了吗?你能打印出$CurrentTimeMinus30min$CurrentTimePlus4Hours吗?缩小潜在的问题区域。

答案 2 :(得分:0)

你试过封装它们吗?这可能会解决您的问题:

SELECT * FROM flightSched 
WHERE day = '$currentDay' 
AND (arrivalTimeSec BETWEEN '$CurrentTimeMinus30min' AND '$CurrentTimePlus4Hours')

另外,为什么不这样做:

$CurrentTimeMinus30min = strtotime('-30 minutes');

或者

$CurrentTimeMinus30min = strtotime(date('Y-m-d H:i:00', strtotime('-30 minutes')));

请向我们发送一些变量产生的例子。

答案 3 :(得分:0)

使用date("H:i",...)strtotime(..)计算时间似乎实际上会产生正确的结果,尽管从当前时间开始添加/减去n分钟的方法更简单:

$now = time();
$currentTimeMinus30min = $now - 30*60;    // 30 minutes * 60 seconds
$currentTimePlus4Hours = $now + 4*60*60;  // 4 hours * 60 minutes * 60 seconds

(我假设你的数据库中的时间条目是unix时间戳。)

您的查询也很好,但有几点需要注意:

  • 您的数据库中有冗余字段(日期和时间可以从时间戳计算)
  • 使用时间变量很容易导致混淆,因为时间过去了,如果数据库中没有与指定时间范围(-30m到+ 240m)匹配的条目,则结果集为空。因此,要测试查询,请使用当前时间戳更新数据库。

我建议如下:

删除冗余列的日期和时间,只使用时间戳作为计算的基础,因为日期和时间已包含在时间戳中。所以只需使用像

这样的简单查询
select * from flightShed
where arrivalTime between $begin and $end