年月型が存在するかのように数値を扱えるPERIOD_* 関数(MySQL)

 

年月型が無いため、月の計算が面倒

カラムに年月のみを持ちたいケースが結構あると思います。
僕は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>

これは便利。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Post Navigation