MySQLで日付系のカラムを比較するときにちょっと手間取ったのでメモ。

0. 環境

[MySQL] 5.7.14

1. 前提

  • 2つのテーブルに型が異なるカラムがあったとします。()内は小数秒の桁数の精度を表してます。

    • テーブルAの定義抜粋

      CreateDate datetime(3) # 小数秒あり
      
    • テーブルBの定義抜粋

      created_at timestamp # 小数秒なし
      

2. 手順

  • この2カラムが一致していることをWHERE句で指定するには、日付フォーマットを揃えるとうまくいきました。

    • SQL文の抜粋

      AND IFNULL(DATE_FORMAT(a.CreateDate, '%Y%m%d%H%i%S'), '') = IFNULL(DATE_FORMAT(b.created_at, '%Y%m%d%H%i%S'), '')
      
    • 今回は秒まで比較できれば十分でしたが、もし小数秒以下も含める場合は、下記を参照してフォーマットを追加して下さい。

3. 日付型の違い

  • そもそもdatetimeとtimestampの使い分けは?というのはこの記事によくまとまっていました。

    • MySQL: DATETIME vs TIMESTAMP

    • ざっくり言うと、こんな感じですね。

      • [datetime] 格納できる値の範囲が広いが、その分容量が必要。
      • [timestamp] インデックス、UTC変換、タイムゾーン対応など、機能性を求めるならこっち。

4. 参考