2016-05-13 53 views
0

如何選擇兩個日期之間的所有日期?如何在mysql中選擇兩年之間的每一年?

我的表是這樣的:

CREATE TABLE IF NOT EXISTS `product_modification` ( 
     `id_product_modification` int(11) NOT NULL AUTO_INCREMENT, 
     `id_category` int(11) NOT NULL, 
     `id_sub_category` int(11) NOT NULL, 
     `name` varchar(255) NOT NULL, 
     `start_production_year` int(8) DEFAULT NULL, 
     `end_production_year` int(8) DEFAULT NULL, 
     `id_product_type` int(8) NOT NULL, 
     PRIMARY KEY (`id_product_modification`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

    INSERT INTO `product_modification` (`id_product_modification`, `id_category`, `id_sub_category`, `name`, `start_production_year`, `end_production_year`, `id_product_type`) VALUES 
    (1, 1, 1, 'product_1', 2003, 2006, 1), 
    (2, 1, 1, 'product_2', 2009, 2011, 1), 
    (3, 1, 1, 'product_3', 2014, 2016, 1); 

我想顯示一排這樣的:

id_product_modification | YEAR 
------------------------------------------ 
        1 | 2003 
        1 | 2004 
        1 | 2005 
        1 | 2006 
        2 | 2009 
        2 | 2010 
        2 | 2011 
        3 | 2014 
        3 | 2015 
        3 | 2016 

有一個內置在這個功能呢?有沒有辦法讓函數返回多行?

它必須是一個函數,因爲我需要在其他SQL語句中使用它。

回答

0

你可以使用一個存儲過程,一個遊標

對於每一行的表走start_production_year,end_production_year和id_product_modification 將您的start_production_year一個時間變量,並打開一個循環。 在每個循環中,將您的時間變量增加一年,然後將生成的年份和id_product_modification插入到您的結果表中 一旦您的時間變量達到end_production_year,就停止循環。你的光標關閉後,返回表

編輯:剛纔注意到你問了一個函數。我非常確定函數不能在MySQL上返回表格

+0

你能寫代碼嗎我是新手 – Mil

0

這裏沒有內置函數,但可以使用下面的函數。它可以在100年的範圍內工作,如果你需要更多的話,你必須在IntBase之內添加另一個連接,以使它成爲y3k就緒。

select pm.id_product_modification, YearBase.yyyy 
from product_modification pm 
join (
select n + (select min(start_production_year) from product_modification) as yyyy 
from 
( 
    SELECT INTPART1.n + INTPART2.n * 10 as n 
    FROM 
    (SELECT 0 as n UNION SELECT 1 union select 2 union select 3 union select 4 union select 5 
    union select 6 union select 7 union select 8 union select 9) INTPART1 
    cross join 
    (SELECT 0 as n UNION SELECT 1 union select 2 union select 3 union select 4 union select 5 
    union select 6 union select 7 union select 8 union select 9) INTPART2 
) as IntBase 
) as YearBase 
on YearBase.yyyy >= pm.start_production_year and YearBase.yyyy <= pm.end_production_year; 
相關問題