あなたの質問を正しく理解しているかどうかはわかりませんが、mysql のDATE_ADD関数を使用して日付に月を追加するだけです (そして、他の日付/時刻関数を使用してそれらを操作します) 。
2012 年 4 月に 4 を足すと 8 月になります。
SELECT DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH),
MONTHNAME(DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH));
+--------------------------------------------------+-------------------------------------------------------------+
| DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH) | MONTHNAME(DATE_ADD(CONCAT(2012,'-04-01'),INTERVAL 4 MONTH)) |
+--------------------------------------------------+-------------------------------------------------------------+
| 2012-08-01 | August |
+--------------------------------------------------+-------------------------------------------------------------+
1 row in set (0.00 sec)
編集:あなたが計算したいのは、今年の4月から与えられたデータである可能性があるという印象を受けます-テーブル内の月は、DATE_SUBで行われます。ご覧のとおり、YEAR() および NOW() 関数を使用して現在の年を取得できます。
SELECT DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH),
MONTHNAME(DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH));
+---------------------------------------------------------+--------------------------------------------------------------------+
| DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH) | MONTHNAME(DATE_SUB(CONCAT(YEAR(NOW()),'-04-01'),INTERVAL 4 MONTH)) |
+---------------------------------------------------------+--------------------------------------------------------------------+
| 2011-12-01 | December |
+---------------------------------------------------------+--------------------------------------------------------------------+
1 row in set (0.02 sec)
2 つの日付の間の月の計算はPERIOD_DIFFで行われますが、特定の形式が必要で、1 桁しかない月には先頭に 0 を追加する必要があります。
SELECT
PERIOD_DIFF(CONCAT(YEAR(NOW()),'04'), -- year + '04' for YYYYMM
CONCAT(YEAR('2011-08-01'), -- year YYYY
IF(MONTH('2011-08-01') < 10, -- got 2 digits for month?
CONCAT('0',MONTH('2011-08-01')), -- no, prepend '0'
MONTH('2011-08-01')) -- yes just return month
)
) AS difference;
+------------+
| difference |
+------------+
| 8 |
+------------+
脳を休ませてようやく見つけたのは、森のようなものの 1 つだった。;)
SET @period=15;
SELECT DATE_ADD( -- use date_add so we can go back and forwards in time
CONCAT(YEAR(NOW()) - FLOOR(IF(@period < 10,0,IF(@period < 12,-1,@period/12 - IF(@period%12 = 0,2,0))) ) ,'-03-01'), -- start from march this year so +1 equals april, subtract 1 year per 12 months
INTERVAL
IF(@period%12 < 10,@period%12,@period%12 - 12) -- ignore the full years, if rest < 10 add (APR - DEC) else subtract (rest - 12 to get negative number)
MONTH)
AS result;
これは常に 1 回の急襲で正しい日付を返すことを保証します。:)