我正在使用MySQL 5.6
我有一个表shift
,其中列start_time
(TIME)和end_time
(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
时),此查询应该有效。任何人都可以帮我解决夜班问题。
答案 0 :(得分:0)
问题是MySQL假设两个TIME都在同一天。因此,当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
答案 1 :(得分:0)
尝试此查询..
mysql> SELECT * FROM shift
`WHERE end_time > CAST(now() - interval 15 minute AS time)
and end_time < `CAST(now() as time);
答案 2 :(得分:-1)
一旦尝试这种方式
select * from aa_shift where
TIMESTAMPDIFF(MINUTE,start_time,end_time) < 15
or
TIMEDIFF(start_time,end_time) < 15