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の使い分けは?というのはこの記事によくまとまっていました。
ざっくり言うと、こんな感じですね。
- [datetime] 格納できる値の範囲が広いが、その分容量が必要。
- [timestamp] インデックス、UTC変換、タイムゾーン対応など、機能性を求めるならこっち。