2013-02-24 64 views
3

我当然可以在服务器端语言中执行此操作,但是我想知道是否可以在SQL中执行此操作。如何选择每个日期的日期范围

我有一个表,如:

CREATE TABLE `dates` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `date_from` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `date_to` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
); 

有了这样

+----+---------------------+---------------------+ 
| id |  date_from  |  date_to  | 
+----+---------------------+---------------------+ 
| 1 | 2013-02-27 00:00:00 | 2013-03-01 00:00:00 | 
| 2 | 2013-02-18 00:00:00 | 2013-02-20 00:00:00 | 
+----+---------------------+---------------------+ 

一些数据(所有日期是在午夜)

我想以某种方式选择这些获得返回:

2013-02-27 00:00:00 
2013-02-28 00:00:00 
2013-03-01 00:00:00 
2013-02-18 00:00:00 
2013-02-19 00:00:00 
2013-02-20 00:00:00 

即,指定范围内的所有日期。

任何想法?

+0

这个问题与填充日期间隙有关http://www.richnetapps.com/using-mysql-generate-daily-sales-reports-filled-gaps/ – 2013-02-24 15:00:18

+0

看看这里的存储过程: http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates – aleroot 2013-02-24 15:05:31

回答

1

你可以用这个单一的查询尝试(它应该做的工作):

SELECT * FROM (
SELECT dates.date_from + INTERVAL a + b DAY dte 
FROM 
(SELECT 0 a UNION SELECT 1 a UNION SELECT 2 UNION SELECT 3 
    UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 
    UNION SELECT 8 UNION SELECT 9) d, 
(SELECT 0 b UNION SELECT 10 UNION SELECT 20 
    UNION SELECT 30 UNION SELECT 40) m, dates 
WHERE dates.date_from + INTERVAL a + b DAY <= dates.date_to 
ORDER BY a + b) e ORDER BY dte; 

看一看的SQL Fiddle

Reference Post

+0

这太疯狂了。 :) – 2013-02-24 16:08:20

相关问题