0

我有一张表 (flightSched),其中包含航班号、航班到达天数、它们是到达还是离开,最重要的是它们的到达时间,如下图所示。

+-------------+----------------+-----------------+-----------------+
| FlightNo    | don            | depOrArriv      | arrivalTime     | 
+-------------+----------------+-----------------+-----------------+
| ET821       | Daily          | Arrival         | 19:45:24        |
| MS838       | Tuesday        | Arrival         | 00:05:24        |
| H7361       | Tuesday        | Arrival         | 23:15:06        |
+-------------+----------------+-----------------+-----------------+

我想在表格中显示当前时间到当前时间前四个小时之间的所有航班。

在我的查询下方查找

SELECT * 
FROM flightSched
WHERE  `arrivalTime` 
BETWEEN CURTIME() 
AND ADDTIME( CURTIME() ,  '04:00:00' ) 
ORDER BY arrivalTime ASC 
LIMIT 0 , 30

该查询完美运行,直到航班在午夜之后到达/离开。根据上表,如果当前时间是 21:00:00,则不会显示航班号 MS838。我哪里错了?

谁能指出我的查询哪里出错了?

4

2 回答 2

1

我相信这是因为ADDTIME没有按照你的想法去做,看看下面的例子:

mysql> SELECT ADDTIME( '19:59:59' ,  '04:00:00' );
+-------------------------------------+
| ADDTIME( '19:59:59' ,  '04:00:00' ) |
+-------------------------------------+
| 23:59:59                            |
+-------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT ADDTIME( '20:00:01' ,  '04:00:00' );
+-------------------------------------+
| ADDTIME( '20:00:01' ,  '04:00:00' ) |
+-------------------------------------+
| 24:00:01                            |
+-------------------------------------+
1 row in set (0.00 sec)

mysql>

一种可能的解决方案是将查询WHERE子句更改为 use TIMEDIFF,然后确保差异在特定范围之间。

如果我们取一些时间值的示例并将TIMEDIFF结果与​​中午进行比较,我们会得到以下结果:

+----------+---------------------------------+
| time     | TIMEDIFF(MAKETIME(12,0,0),time) |
+----------+---------------------------------+
| 01:00:00 | 11:00:00                        |
| 03:00:00 | 09:00:00                        |
| 05:00:00 | 07:00:00                        |
| 07:00:00 | 05:00:00                        |
| 11:00:00 | 01:00:00                        |
| 13:00:00 | -01:00:00                       |
| 15:00:00 | -03:00:00                       |
| 17:00:00 | -05:00:00                       |
| 19:00:00 | -07:00:00                       |
| 21:00:00 | -09:00:00                       |
| 23:00:00 | -11:00:00                       |
+----------+---------------------------------+

未来的时间会导致负时差(按所示顺序提供的参数),因此对于尚未环绕的时间,我们知道 -00:00:00 和 -04:00:00 之间的任何范围是可以接受(基于您提前 0 - 4 小时的更新。

因此,要检查正常的无包装时间,以下应该可以工作:

TIMEDIFF( CURTIME() , arrivalTime) 在 MAKETIME(-4,0,0) 和 MAKETIME(0,0,0) 之间

如果我们然后检查确实包装的值:

+----------+----------------------------------+
| time     | TIMEDIFF(MAKETIME(23,30,0),time) |
+----------+----------------------------------+
| 01:00:00 | 22:30:00                         |
| 03:00:00 | 20:30:00                         |
| 05:00:00 | 18:30:00                         |
| 07:00:00 | 16:30:00                         |
| 11:00:00 | 12:30:00                         |
| 13:00:00 | 10:30:00                         |
| 15:00:00 | 08:30:00                         |
| 17:00:00 | 06:30:00                         |
| 19:00:00 | 04:30:00                         |
| 21:00:00 | 02:30:00                         |
| 23:00:00 | 00:30:00                         |
+----------+----------------------------------+

我们看到超过 20 小时的值应该是可以接受的。

  OR TIMEDIFF( CURTIME() ,  `arrivalTime` ) > MAKETIME(20,0,0)

随着对 30m 到 4h 时差的要求的变化,可能值得完全改变方法以将整个时间戳转换为午夜过后的秒数,然后比较差异,以一天中的秒数为模并检查结果。

于 2013-11-06T17:48:26.497 回答
0

是的!我终于想通了!

因为我需要一个查询来区分当天到达的航班和午夜后第二天到达的航班(基于时间),所以我不得不通过将到达时间列数据从 TIME 更改为稍微重新构造表 (flightSched)约会时间。随后,这意味着此列中的内容以以下格式保存:YYYY-MM-DD HH:MM:SS 或 (2013-11-22 12:30:00) 而不是仅 12:30:00,即丰富得多。

然后我注意到下面的查询通过算术计算正确地计算到午夜之后的第二天/日期的时间。

如果当前时间是 21:00

//################################################
//## Subtract the 30 minutes from the current time
mysql> SELECT SUBTIME(NOW(), '00:30:00' );
+-------------------------------------+
| SUBTIME(NOW(),  '00:30:00' )        |
+-------------------------------------+
| 2013-11-22 20:30:00                 |
+-------------------------------------+
1 row in set (0.00 sec)

//################################################
//## Add the 4 hours to the current time


mysql> SELECT ADDTIME(NOW(),  '04:00:00');
+-------------------------------------+
| ADDTIME(NOW() ,  '04:00:00' )       |
+-------------------------------------+
| 2013-11-23 01:00:00                 |
+-------------------------------------+
1 row in set (0.00 sec)

笔记!从 2013-11-22 21:00:00 到 2013-11-23 01:00:00 的日期也发生了多么完美的变化。:-)

使用下表

+-------------+----------------+-----------------+---------------------+
| FlightNo    | don            | depOrArriv      | arrivalTime         | 
+-------------+----------------+-----------------+---------------------+
| ET821       | Daily          | Arrival         | 2013-11-22 19:45:24 |
| MS838       | Tuesday        | Arrival         | 2013-11-23 01:05:24 |
| H7361       | Tuesday        | Arrival         | 2013-11-22 23:15:06 |
+-------------+----------------+-----------------+---------------------+

运行查询:

SELECT * FROM flightSched WHERE arrivalTime
                                 BETWEEN  SUBTIME(NOW(), '00:30:00')
                 AND ADDTIME(NOW(),'04:00:00')
                 ORDER BY arrivalTime ASC 

产量:

+-------------+----------------+-----------------+---------------------+
| MS838       | Tuesday        | Arrival         | 2013-11-23 01:05:24 |
| H7361       | Tuesday        | Arrival         | 2013-11-22 23:15:06 |
+-------------+----------------+-----------------+---------------------+

非常感谢您的时间和努力。

于 2013-11-22T12:05:34.973 回答