2013-12-10 3 views
0

У меня есть запись MySql как этотMySQL разбивка даты между диапазоном дат

name sdate  edate 
John 2013-12-01 2013-12-04 
Will 2013-12-04 2013-12-06 
Smith 2013-12-02 2013-12-05 

Мне нужна один запрос для результата, как этого

name stay_date 
John 2013-12-01 
John 2013-12-02 
John 2013-12-03 
John 2013-12-04 
Will 2013-12-04 
Will 2013-12-05 
Will 2013-12-06 
Smith 2013-12-02 
Smith 2013-12-03 
Smith 2013-12-04 
Smith 2013-12-05 

Thanx много заранее ..

+0

взять бабло в этом же вопрос: Http: // StackOverflow .com/а/10432083/1675233 – Mehdi

ответ

0

Для вам понадобится таблица подсчета (цифр), которую вы можете создать и заполнить следующим образом:

CREATE TABLE tally(n INT NOT NULL PRIMARY KEY); 
INSERT INTO tally(n) 
SELECT a.N + b.N * 10 + 1 n 
FROM 
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
ORDER BY n; 

Теперь ваш запрос может выглядеть

SELECT name, sdate + INTERVAL n.n - 1 DAY stay_date 
    FROM table1 t JOIN tally n 
    ON n.n <= edate - sdate + 1 

Выход:

 
+-------+------------+ 
| name | stay_date | 
+-------+------------+ 
| John | 2013-12-01 | 
| John | 2013-12-02 | 
| John | 2013-12-03 | 
| John | 2013-12-04 | 
| Will | 2013-12-04 | 
| Will | 2013-12-05 | 
| Will | 2013-12-06 | 
| Smith | 2013-12-02 | 
| Smith | 2013-12-03 | 
| Smith | 2013-12-04 | 
| Smith | 2013-12-05 | 
+-------+------------+ 

Вот SQLFiddle демо

Смежные вопросы