2013-09-28 391 views
2

我收到了2列,一個是開始日期,另一個是結束日期。我需要在兩個日期之間找到每一天。在mysql中的開始日期和結束日期之間查找日期

需要在另一個表中有兩個顏色,一個名稱pno引用第一個表中的pno的ID,而另一個表的開始日期和結束日期之間的日期。

舉個例子,這可能是我輸入

 
pno   startdate  end date 
p1   2012-12-03  2012-12-06  
p2   2013-01-05  2013-01-08 
p3   2013-01-15  2012-01-20 

,這已經是我的輸出。

 
pno   dates 
---------- 
p01   2012-12-03 
p01   2012-12-04 
p01   2012-12-05 
p01   2012-12-06 
p02   2013-01-05 
p02   2013-01-06 
p02   2013-01-07 
p02   2013-01-08 
p03   2013-01-15 
... 

回答

4

你可以像下面這樣做

SELECT pno, startdate + INTERVAL q.n - 1 DAY dates 
    FROM table1 t CROSS JOIN 
(
    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 
) q 
WHERE q.n - 1 <= DATEDIFF(enddate, startdate) 
ORDER BY pno, dates 

子查詢生成的數字從1序列100可以調整它爲您的需要(如日期不同,跨越多個或不到100天),或者如果你做了很多這樣的查詢,完全用一個持久的Tally(數字)表代替它。

輸出:

 
+------+------------+ 
| pno | dates  | 
+------+------------+ 
| p1 | 2012-12-03 | 
| p1 | 2012-12-04 | 
| p1 | 2012-12-05 | 
| p1 | 2012-12-06 | 
| p2 | 2013-01-05 | 
| p2 | 2013-01-06 | 
| p2 | 2013-01-07 | 
| p2 | 2013-01-08 | 
| p3 | 2013-01-15 | 
| p3 | 2013-01-16 | 
| p3 | 2013-01-17 | 
| p3 | 2013-01-18 | 
| p3 | 2013-01-19 | 
| p3 | 2013-01-20 | 
+------+------------+ 

這裏是SQLFiddle演示


UPDATE:要創建並填充持久理貨表使用

CREATE TABLE tally (n INT NOT NULL PRIMARY KEY); 

INSERT INTO tally (n) 
SELECT a.n + b.n * 10 + c.n * 100 + d.n * 1000 + 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 
,(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) c 
,(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) d 
ORDER BY n; 

ÿ你會在統計表中得到1到10000的數字序列。這將允許你使用超過27年的日期範圍。

現在查詢歸結爲

SELECT pno, startdate + INTERVAL q.n - 1 DAY dates 
    FROM table1 t CROSS JOIN tally q 
WHERE q.n - 1 <= DATEDIFF(enddate, startdate) 
ORDER BY pno, dates 

這裏是SQLFiddle演示

+0

對於具有2年以上 – user2825758

+0

跨度日期@ user2825758見更新的答案,sqlfiddle例子。用提供的腳本創建一個持久的Tally(數字)表並使用它。恕我直言,它是**最快和通用的方式**與日期範圍一起工作。任何其他方法都需要使用已存儲的例程才能使用循環,並且速度會更慢,方式更不靈活。 – peterm

+0

@ user2825758如果您覺得答案有幫助,請考慮** [接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)** 。 – peterm

相關問題