我有一个表refill_roster,每天有3个时段
mysql> select day,slot1,slot2,slot3 from location_refill_roster;
+------+----------+----------+----------+
| day | slot1 | slot2 | slot3 |
+------+----------+----------+----------+
| 1 | 14:45:22 | 14:45:24 | 14:45:25 |
| 2 | 14:45:22 | 14:45:24 | 14:45:25 |
| 3 | 14:45:22 | 14:45:24 | 14:45:25 |
| 4 | 14:45:22 | 14:45:24 | 14:45:25 |
| 5 | 14:45:22 | 14:45:34 | 14:45:25 |
| 6 | 14:45:22 | 14:45:24 | 14:45:25 |
| 7 | 09:45:22 | 11:45:28 | 12:45:25 |
+------+----------+----------+----------+
我想在某个时间点找到当天的下一个时段。例如,在第7天的10:00:00,下一个可用的插槽应该是slot2,即11:45:28。
无法找到将数字与多列进行比较的方法。所以我转换了表并写了一个子查询进行比较。有没有更好的方法来实现解决方案
SELECT slots,
MAX(CASE WHEN day = '1' THEN value END) `1`,
MAX(CASE WHEN day = '2' THEN value END) `2`,
MAX(CASE WHEN day = '3' THEN value END) `3`,
MAX(CASE WHEN day = '4' THEN value END) `4`,
MAX(CASE WHEN day = '5' THEN value END) `5`,
MAX(CASE WHEN day = '6' THEN value END) `6`,
MAX(CASE WHEN day = '7' THEN value END) `7`
FROM
(
SELECT day, slots,
CASE slots
WHEN 'slot1' THEN slot1
WHEN 'slot2' THEN slot2
WHEN 'slot3' THEN slot3
END value
FROM refill_roster t CROSS JOIN
(
SELECT 'slot1' slots UNION ALL
SELECT 'slot2' UNION ALL
SELECT 'slot3'
) c where t.day=7
) q
GROUP BY slots
ORDER BY FIELD(slots, 'slot1', 'slot2', 'slot3')
答案 0 :(得分:1)
请考虑以下事项:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(day INT NOT NULL
,slot INT NOT NULL
,time TIME NOT NULL
,PRIMARY KEY(day,slot)
);
INSERT INTO my_table VALUES
(1,1,'14:45:22'),
(2,1,'14:45:22'),
(3,1,'14:45:22'),
(4,1,'14:45:22'),
(5,1,'14:45:22'),
(6,1,'14:45:22'),
(7,1,'09:45:22'),
(1,2,'14:45:24'),
(2,2,'14:45:24'),
(3,2,'14:45:24'),
(4,2,'14:45:24'),
(5,2,'14:45:34'),
(6,2,'14:45:24'),
(7,2,'11:45:28'),
(1,3,'14:45:25'),
(2,3,'14:45:25'),
(3,3,'14:45:25'),
(4,3,'14:45:25'),
(5,3,'14:45:25'),
(6,3,'14:45:25'),
(7,3,'12:45:25');
SELECT *
FROM my_table
WHERE day = 7
AND time > '10:00:00'
ORDER
BY slot
LIMIT 1;
+-----+------+----------+
| day | slot | time |
+-----+------+----------+
| 7 | 2 | 11:45:28 |
+-----+------+----------+
1 row in set (0.00 sec)
答案 1 :(得分:0)
我不是MySQL用户,但这就是我接近它的方式。如果我提出MySQL不能做的事情,我相信其他人可以纠正我。
我假设那天(1-7)是一个参数,所以我称之为@day
。我还假设您想要比较的时间是@currentTime
。
我也假设slot1 <= slot2 <= slot3
。如果情况并非总是如此,那么这将变得更加复杂。
select case when @currentTime <= slot1 then slot1
when @currentTime <= slot2 then slot2
when @currentTime <= slot3 then slot3
else null
end as [NextSlot]
from refill_roster rr
where rr.day = @day