sql获取两个表日期之间的所有日期

时间:2017-01-26 21:26:42

标签: mysql sql date between

另一个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

我应该使用子查询吗? 感谢我指向正确的方向!

1 个答案:

答案 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