0

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

4 回答 4

2

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

..... WHERE columname BETWEEN smallervalue AND biggervalue

以前我尝试过在前面使用较大的值,因为我处理的是负数,但它失败了。您可能会发现与您的时间戳相同的问题。

于 2014-07-15T00:08:29.467 回答
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?缩小潜在问题的范围。

于 2013-10-09T09:34:01.583 回答
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')));

请向我们发送一些您的变量生成的示例。

于 2013-10-09T09:49:45.873 回答
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
于 2013-10-09T09:53:26.233 回答