2013年11月5日火曜日

MySQLでProcedureを使って動的表を返す

開始年月と終了年月を指定すると、表にして返してくれるサンプルです

コード


DROP PROCEDURE IF EXISTS procedureName;
DELIMITER ;;
CREATE DEFINER=root@localhost PROCEDURE `procedureName`(in `arg_ym_start` varchar(10),in `arg_ym_end` varchar(10))
  READS SQL DATA
BEGIN
  -- 年月の開始と終了を指定することにより、年月の表を返す
  declare current_ym varchar(10);
  DROP TABLE IF EXISTS tmp_ym;
  CREATE TEMPORARY TABLE tmp_ym
  (
    title      varchar(100)
    ,yearmonth    varchar(10)
    ,ym_start     varchar(10)
    ,ym_end      varchar(10)
  );
  set current_ym = arg_ym_start;
  CREYMD : WHILE current_ym <= arg_ym_end DO
    INSERT INTO tmp_ym values (current_ym,current_ym,CONCAT(current_ym,'/01'), DATE_FORMAT(ADDDATE(ADDDATE(CONCAT(current_ym,'/01'),INTERVAL 1 MONTH),INTERVAL -1 DAY),'%Y/%m/%d'));
    set current_ym = SUBSTR(DATE_FORMAT(ADDDATE(CONCAT(current_ym,'/01'),INTERVAL 1 MONTH),'%Y/%m/%d'),1,7);
  END WHILE CREYMD;

  SELECT
  title  
  ,yearmonth
  ,ym_start
  ,ym_end 
  from
  tmp_ym;
  DROP TABLE IF EXISTS tmp_ym;

END;;
DELIMITER ;

実行結果例


mysql> call procedureName('2012/01','2012/12');
+---------------+-----------+------------+------------+
| title     | yearmonth | ym_start  | ym_end   |
+---------------+-----------+------------+------------+
| 2012/01    | 2012/01  | 2012/01/01 | 2012/01/31 |
| 2012/02    | 2012/02  | 2012/02/01 | 2012/02/29 |
| 2012/03    | 2012/03  | 2012/03/01 | 2012/03/31 |
| 2012/04    | 2012/04  | 2012/04/01 | 2012/04/30 |
| 2012/05    | 2012/05  | 2012/05/01 | 2012/05/31 |
| 2012/06    | 2012/06  | 2012/06/01 | 2012/06/30 |
| 2012/07    | 2012/07  | 2012/07/01 | 2012/07/31 |
| 2012/08    | 2012/08  | 2012/08/01 | 2012/08/31 |
| 2012/09    | 2012/09  | 2012/09/01 | 2012/09/30 |
| 2012/10    | 2012/10  | 2012/10/01 | 2012/10/31 |
| 2012/11    | 2012/11  | 2012/11/01 | 2012/11/30 |
| 2012/12    | 2012/12  | 2012/12/01 | 2012/12/31 |
+---------------+-----------+------------+------------+

0 件のコメント: