2016-05-13 15 views
0

どのようにして2つの日付の間の日付をすべて選択できますか?私はこのような行を表示したいmysqlで2年間の年を選択するにはどうすればいいですか?

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を割り当て、ループを開くことができます。 各ループで、一時変数を1年増分し、結果の年と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; 
関連する問題