年月型が無いため、月の計算が面倒
カラムに年月のみを持ちたいケースが結構あると思います。
僕はint型で[YYYYMM]形式の数値を持たせることが多いのですが、
月の加算が必要な場合、int型であるためにDATE_ADD() などの便利な関数が使えません。
201212 + 1(か月) = 201301 とはならないですよね当然。
MySQLに年月型というのは存在しませんが、以下の関数を使うことで、int型を年月型として使いやすくなります。
PERIOD_*系の関数で年月型のようにint型を扱う
PERIOD_* 系の関数を使うと、YYYYMM形式の数値に対して、あたかも年月型であるかのように計算ができます。
PERIOD_ADD(P,Ns)
N 月を、期間 P に加えます (フォーマットは YYMM または YYYYMM) 。フォーマット YYYYMM で値を返します。期間引数 P は日付値ではありません のでご注意ください。
PERIOD_DIFF(P1,P2)
期間 P1 と P2 間の月の数を返します。P1 および P2 は、YYMM または YYYYMM のフォーマットになります。期間引数 P1 および P2 は日付値ではありませんのでご注意ください。
PERIOD_*関数を実際に試す
結果を見ればわかる通り、
- 201212 に 1(か月) を足すと → 201301
- 201212 と 201112 の差は → 12(か月)
という結果になりました。
※MySQL 5.1.46環境で実行しました。
mysql> CREATE TABLE test -> ( -> id int NOT NULL AUTO_INCREMENT, -> month int NOT NULL, -> PRIMARY KEY (id) -> ); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO test (month) VALUES (201212); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM test; +----+--------+ | id | month | +----+--------+ | 1 | 201212 | +----+--------+ 1 row in set (0.00 sec) mysql> SELECT PERIOD_ADD(month, 1) AS month FROM test WHERE id = 1; +--------+ | month | +--------+ | 201301 | +--------+ 1 row in set (0.08 sec) mysql> SELECT PERIOD_DIFF(month, 201112) AS month FROM test WHERE id = 1; +-------+ | month | +-------+ | 12 | +-------+ 1 row in set (0.00 sec) mysql>
これは便利。
最近のコメント