sql文で日付の範囲を指定する際の注意点【DATE関数】
この記事では、SQLで日付範囲を指定する際によく起こるミスと、その解決方法を分かりやすく紹介します。。
この記事を読むメリット
- sqlで日付範囲を指定する際のはまりポイントを理解できる
- 適切な日付範囲の指定方法が分かる
sqlで日付範囲を指定する際のはまりポイント
sqlで日付範囲を指定する際、以下のような文をよく見かけます。
select id, name, email, created_at
from users
where created_at between '2024-05-01' AND '2024-05-18';
一見すると「2024/5/1〜2024/5/18の間に作成されたユーザー」を取得できそうに見えます。
ここで、以下のようなusersテーブルで考えてみます。
select id, name, email, created_at from users;
+----+--------+-----------------+---------------------+
| id | name | email | created_at |
+----+--------+-----------------+---------------------+
| 1 | test | test@test.com | 2024-05-17 11:43:52 |
| 2 | test02 | test02@test.com | 2024-05-18 12:25:48 |
+----+--------+-----------------+---------------------+
2024/5/17に作成されたユーザーと2024/5/18に作成されたユーザーが存在します。
そこで先ほどのsql文を実行すると、
select id, name, email, created_at
from users
where created_at between '2024-05-01' AND '2024-05-18';
+----+------+---------------+---------------------+
| id | name | email | created_at |
+----+------+---------------+---------------------+
| 1 | test | test@test.com | 2024-05-17 11:43:52 |
+----+------+---------------+---------------------+
このような結果になります。
そのため、2024/5/18に作成されたユーザーは結果に含まれません。
なぜ「2022-05-18」のデータが含まれないのか
理由は時刻が「00:00:00」として指定されているからです。
先ほどのsql文は以下のように置き換えることができます。
select id, name, email, created_at
from users
where created_at between '2024-05-01 00:00:00' AND '2024-05-18 00:00:00';
これでは「2024-05-18 12:25:48」のデータが取得できないのは納得ですね。
日付範囲を指定するときは、このような見落としが起きやすい点に注意が必要です。
私もなぜ指定しているのにデータが取れないんだと思ったことがあります。
DATE関数を使って日付を指定する
解決策はDATE関数を使うことです。
DATE関数とは日付部分のみを抽出する関数です。
select date('2024-05-18 12:25:48');
+-----------------------------+
| DATE('2024-05-18 12:25:48') |
+-----------------------------+
| 2024-05-18 |
+-----------------------------+
このように時刻まである値を日付部分のみにしてくれます。
この関数を使えば、日付のみで正しく範囲指定ができるようになります。
select id, name, email, created_at
from users
where date(created_at) between '2024-05-01' AND '2024-05-18';
+----+--------+-----------------+---------------------+
| id | name | email | created_at |
+----+--------+-----------------+---------------------+
| 1 | test | test@test.com | 2024-05-17 11:43:52 |
| 2 | test02 | test02@test.com | 2024-05-18 12:25:48 |
+----+--------+-----------------+---------------------+
これで2024/5/18のデータも問題なく取得できるようになりました。
LaravelのEloquentの場合はWhereDateを使おう
私はLaravelを使う機会が多く、Eloquentを使ってデータを取得することも多いです。
Laravelの場合も、日付条件には基本的に「whereDate」を使うのが安全です。
Laravelの記事も公開しているので気になる方は参考にしてみてください。
Laravelで日付を条件にデータ取得する際はwhereDateを使おう
sqlで日付の範囲指定する際はDate関数を使う
いかがだったでしょうか。
日付を取り扱う場合は注意が必要です。
取りたいデータが取れないといったバグになります。
DATE関数を利用して、意図した日付範囲を正確に扱うようにしましょう。

