2017-08-25 275 views
0

我有一個日期範圍列表,我希望獲取這些日期範圍內所有月份的列表。我可以查詢我的日期範圍,像這樣:mysql中多個日期範圍內的月份列表

Select id, start, end 
From date_range 

而這個查詢將給出以下的輸出:

1, 01-01-2016, 25-03-2016 
2, 26-03-2016, 30-03-2016 
3, 30-12-2016, 08-01-2017 

現在我想找到一個MySQL查詢,只是列出了這些日期範圍內的所有月份。所以應該給下面的輸出:

01-2016 
02-2016 
03-2016 
12-2016 
01-2017 

已經有例子在這裏如何獲得兩個日期之間,例如在本月的列表:

但這些例子是關於單個日期範圍,但我有多個日期範圍。如果有人可以爲我的問題找到一個sql查詢,那將會很棒。

+0

你的問題是有點混亂。你想要在日期範圍內的所有月份,或只是範圍內每個開始/結束日期的月份/年份? –

+0

@Sloan:我想要在日期範圍內的所有月份。所以如果一個日期範圍跨越5個月,那麼應該出現所有5個月。 –

+1

這實際上是一個顯示問題,因此,最好在應用程序代碼 – Strawberry

回答

0

這裏是一個解決方案:

#DROP TABLE IF EXISTS monthTest; 
CREATE TABLE monthTest(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `start` DATETIME, `end`DATETIME); 

INSERT INTO monthTest(`start`, `end`) VALUES 
    ('2016-01-01', '2016-03-25'), 
    ('2016-03-26', '2016-03-30'), 
    ('2016-12-30', '2017-08-01'); 

SELECT A.`start`, A.`end`, DATE_FORMAT(DATE_ADD(A.`start`, INTERVAL B.help_keyword_id MONTH), '%Y%m') FROM 
    monthTest A, 
    mysql.help_keyword B 
WHERE PERIOD_DIFF(DATE_FORMAT(A.`end`, '%Y%m'), DATE_FORMAT(A.`start`, '%Y%m')) >= B.help_keyword_id 
ORDER BY A.id; 

注意這個查詢在第二JOIN表具有相關性,該表必須包含數月的任意兩個日期和連接字段之間必須最大數量更多的行從0開始遞增INTEGER。這是由於mysql沒有(還)包含行生成器的限制,所以需要解決方法。

問候,

詹姆斯

相關問題