我相信这是因为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 时差的要求的变化,可能值得完全改变方法以将整个时间戳转换为午夜过后的秒数,然后比较差异,以一天中的秒数为模并检查结果。