SQLで日付条件を使ってデータを抽出したい場合、代表的な書き方として BETWEEN や >= / <=(範囲指定) を利用します。
しかし、実務では 時間を含むデータ や 境界値の違い により、意図したデータが取得できないケースが発生しやすいです。
この記事では、SQLで日付条件を扱う際の基本から、実務で気をつけるポイントまでわかりやすく解説します。
1. 基本の書き方:BETWEEN を使う
BETWEEN は指定した開始日と終了日 両方を含む 範囲検索です。
✔ 特徴
-
>=と<=を同時に書くのと同じ意味 -
開始日・終了日を含む(Inclusive)
2. >= / <= で範囲指定する書き方
BETWEEN と同じ結果になりますが、柔軟性の高い書き方です。
✔ メリット
-
日付だけではなく、時間(時刻)条件も組み合わせやすい
-
>,<,<=,>=を使い分けられる
3. 時間が含まれる型(timestamp/datetime)の注意点
例えば 2025-01-31 14:35:20 など、時間まで保存されている場合、以下のように書くと 1月31日のデータが漏れます。
→ 2025-01-31 00:00:00 までしか含まれません。
✔ 正しい書き方(時刻含むデータ)
方法①:終了日を翌日扱いにし < を使う(最も推奨)
方法②:終了日を23:59:59にする(非推奨・環境依存)
→ 秒まで正確でない可能性があるため、業務システムでは推奨されません。
4. DB製品別の書き方の違い
| DB | 注意点 / 推奨書き方 |
|---|---|
| MySQL | DATE(order_date) を条件にするとINDEX無効になるので注意 |
| SQL Server | BETWEEN より < 次月1日 の方がトラブルが少ない |
| Oracle | TRUNC() を使用して丸める書き方も一般的 |
Oracleの例:
5. 日付範囲検索のベストプラクティス比較
| 条件 | 精度 | 可読性 | 実務向き |
|---|---|---|---|
| BETWEEN | ◎ | ◎ | △(時刻付きデータで注意) |
| >= AND <= | ◎ | ○ | ○ |
| >= AND < 次月1日 | ◎(漏れない) | ○ | ◎(最も安全) |
6. まとめ
SQLで日付条件を扱う際には、データが 日付型か datetime型か によって書き方を変える必要があります。
-
日付型なら
BETWEENでも問題ない -
時刻を含む型(datetime/timestamp)なら
➡ 「終了日 < 翌月1日」の書き方が安全
