另一个SQL挑战!
我想编写一个MySQL查询,它可以在一个记录中的两个日期之间获取所有日期。
opening_times
id | begin | end
1 | 10:00:00 | 17:00:00
2 | 10:00:00 | 18:00:00
3 | 10:00:00 | 19:00:00
opening_periods
id | opening_time_id | begin | end
1 | 3 | 2016-03-26 | 2016-03-28
2 | 2 | 2016-03-29 | 2016-04-01
3 | 1 | 2016-04-02 | 2016-04-03
我想要输出:
date | begin | end
2016-03-26 | 10:00:00 | 19:00:00
2016-03-27 | 10:00:00 | 19:00:00
2016-03-28 | 10:00:00 | 19:00:00
2016-03-29 | 10:00:00 | 18:00:00
2016-03-30 | 10:00:00 | 18:00:00
2016-03-31 | 10:00:00 | 18:00:00
2016-04-01 | 10:00:00 | 18:00:00
2016-04-02 | 10:00:00 | 17:00:00
2016-04-03 | 10:00:00 | 17:00:00
我应该使用子查询吗? 感谢我指向正确的方向!
答案 0 :(得分:1)
您可以使用复杂查询在mysql中解决它。 首先,您需要构建一个将生成整数序列的子查询,如this answer:
SELECT @row := @row + 1 as rown FROM
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(SELECT @row:=-1) x
这将用于为您的日期间隔中的每个条目生成这么多行。
SELECT DATEDIFF(`end`,`begin`) as number_of_days FROM `opening_periods`
所有放在一起的内容将如下所示:
SELECT DATE_ADD( o.`begin`, INTERVAL days day) as date_field, t.begin, t.end
FROM `opening_periods` o INNER JOIN (
SELECT id, rown as days
FROM `opening_periods`,
(SELECT @row := @row + 1 as rown FROM
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t1,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(SELECT @row:=-1) x) numbers_table
WHERE rown <= DATEDIFF(`end`,`begin`)) r
ON o.id = r.id
INNER JOIN `opening_times` t ON o.`opening_time_id` = t.id
ORDER BY o.id
这是一个小提琴:http://rextester.com/AKDRI84101