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查询中使用它们。这似乎根本不起作用。
这个查询我哪里错了?任何帮助将不胜感激。
答案 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时间戳。)
您的查询也很好,但有几点需要注意:
我建议如下:
删除冗余列的日期和时间,只使用时间戳作为计算的基础,因为日期和时间已包含在时间戳中。所以只需使用像
这样的简单查询select * from flightShed
where arrivalTime between $begin and $end