この記事では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」のデータが取得できないのは納得ですね。
日付を指定範囲としてsqlを実行する際にはこのようなミスが起こりがちです。
私もなぜ指定しているのにデータが取れないんだと思ったことがあります。
エンジニアにおすすめ書籍
エンジニアになりたて、これから勉強を深めていきたいという方におすすめの書籍はこちら!
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を使ってデータを取得することも多いです。
その場合も、日付の条件を入れる際には「WhereDate」を使うようにしています。
Laravelの記事も公開しているので気になる方は参考にしてみてください。
Laravelで日付を条件にデータ取得する際はwhereDateを使おう
sqlで日付の範囲指定する際はDate関数を使う
いかがだったでしょうか。
日付を取り扱う場合は注意が必要です。
取りたいデータが取れないといったバグになります。
Date関数を使って正確な指定をしましょう。