じゅにゃくんのはてブロ。

ブログ不精なんですが...。

MySQLの日付処理でハマり(TIMESTAMPDIFFの精度、SELECTのWHERE句に日付を使う)

TIMESTAMPDIFF関数の精度がちょっと危うい感じです。

mysql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2014-10-30 19:57:52 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT TIMESTAMPDIFF(MONTH, NOW(), '2014-12-01');
+-------------------------------------------+
| TIMESTAMPDIFF(MONTH, NOW(), '2014-12-01') |
+-------------------------------------------+
|                                         1 |
+-------------------------------------------+
1 row in set (0.00 sec)

結果は2が欲しいんですけど。特定日時からの経過月数を計算するときはPERIOD_DIFF関数を使うのがベストなのでしょうかね。

mysql> SELECT PERIOD_DIFF(201412, 201410);
+-----------------------------+
| PERIOD_DIFF(201412, 201410) |
+-----------------------------+
|                           2 |
+-----------------------------+
1 row in set (0.00 sec)

引数は日付型のまま扱いたいんですけどなあ。中途半p…


サーバとクライアントでCHARSETが一致していない環境でSELECT(UPDATEもかも)のWHERE句に日付をふくめるときにスラッシュを含めた表記していると意図したとおりに動作しないことがあるようです。

日付型のフォーマットにスラッシュを使ってはいけません(文字コードによって値が変わる) - [MySQL/SQL] ぺんたん info

基本的にCHARSETが揃っていない時点でダメなんでしょうけれど、テーブル単位、カラム単位で文字コードが設定できるそうでそういう時は大変だろうなあ。
日付の区切りはスラッシュ(/)じゃなくハイフン(-)にしといたほうが無難なのでしょうか。