💡

SQLで日付の範囲指定をしたいときにありがちなミス

2022/10/14に公開

よくありそうな間違い

「2022年1月1〜1月2日に作成されたユーザー一覧を出したい」ときに、以下のようなSQLを書いたとします。

悪い例
SELECT *
FROM users
WHERE created_at BETWEEN '2022-01-01' AND '2022-01-02'

これでもOKなようにも見えますが、実行してみると1月1日に作成されたユーザーは取得できますが1月2日に作成されたユーザーは検索に引っかかりません。

では以下のように時刻まで指定すればいいのではと思うかもしれませんが、'2022-01-02 23:59:59.000001'のようにミリ秒単位まで保存されているレコードは検索に引っかかりません。

微妙な例(時刻を指定しても取りこぼす可能性がある)
SELECT *
FROM users
WHERE created_at BETWEEN '2022-01-01 00:00:00' AND '2022-01-02 23:59:59'

どうすればいいか?

DATE関数でcreated_atの日付部分のみを取得してから日付と比較すればOKです。

良い例
SELECT *
FROM users
WHERE DATE(created_at) BETWEEN '2022-01-01' AND '2022-01-02'

DATE関数を使うことで、日付部分だけを抽出できるので正しく比較することができます。

DATE関数の挙動
SELECT DATE('2022-01-01 00:00:00')
# => '2022-01-01'

Discussion