我正在使用MySQL 5.6
我有一个表shift
列start_time
列(时间)和end_time
列(时间):
+------------+----------+
| start_time | end_time |
+------------+----------+
| 07:00:00 | 16:00:00 |
| 15:00:00 | 23:00:00 |
| 22:00:00 | 07:00:00 |
| 12:00:00 | 21:00:00 |
| 12:00:00 | 09:00:00 |
| 10:00:00 | 20:00:00 |
| 23:00:00 | 01:00:00 |
| 21:00:00 | 05:00:00 |
+------------+----------+
我想找到将在接下来的 15 分钟内结束的所有班次。以上是示例数据,顺便说一句,它也可以有几分钟。
这是我尝试过的:
SELECT start_time, end_time
FROM shift
WHERE TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) < 900;
结果:
+------------+----------+
| start_time | end_time |
+------------+----------+
| 22:00:00 | 07:00:00 |
| 12:00:00 | 09:00:00 |
| 23:00:00 | 01:00:00 |
| 21:00:00 | 05:00:00 |
+------------+----------+
当我的表中没有任何夜班时(即当start_time
大于 end_time
时),此查询应该有效。谁能帮我解决夜班的情况。
问题是MySQL假设两个时间在同一天。所以过去end_time
会得到阴性的结果,这会触发你的< 900
状况,给你太多的结果。
我看到两种解决此问题的方法:
1:扩展条件以删除阴性结果
SELECT start_time, end_time
FROM foo
WHERE TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) > 0
AND TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) < 900
2:较短的方法,将所有负值加24小时。通常 MOD() 函数可以解决问题,但不知何故它在 MySQL 中没有这样做,所以你还需要在你的值中添加 24 小时:
SELECT start_time, end_time
FROM foo
WHERE MOD(TIME_TO_SEC(TIMEDIFF(end_time, TIME(NOW()))) + 24*60*60, 24*60*60) < 900
尝试这个查询。
mysql> SELECT * FROM shift
`WHERE end_time > CAST(now() - interval 15 minute AS time)
and end_time < `CAST(now() as time);
一旦尝试这种方式
select * from aa_shift where
TIMESTAMPDIFF(MINUTE,start_time,end_time) < 15
or
TIMEDIFF(start_time,end_time) < 15