データを抽出する際、日付を比較して条件に合ったデータのみを選択したいケースはよくあります。
本記事では、SQLのWHERE句で日付を比較する方法について、各処理をサンプルSQLを交えながらご紹介していきたいと思います。
目次
SQLの日付比較サンプル用データベース
SQLでの日付比較方法の解説を始める前に、本記事で利用するテーブルについて掲載しておきます。
今回使用するのは「test1」という下記のデータが格納されたテーブルのみです。
test1
+------+---------------------+ | id | date | +------+---------------------+ | 1 | 2020-07-26 14:00:00 | | 2 | 2020-07-27 13:00:00 | | 3 | 2020-07-28 14:00:00 | | 4 | 2020-07-29 15:00:00 | | 5 | 2020-08-28 14:00:00 | | 6 | 2021-07-28 14:00:00 | +------+---------------------+
SQLの日付比較1: 同一日付
SQLで同一日付のデータを取得したい場合には「=(イコール)」演算子を利用します。
サンプル
今回のサンプルでは「2020-07-26 14:00:00」のデータと同一日付のデータを取得してみたいと思います。
SELECT * FROM test1 WHERE date = '2020-07-26 14:00:00';
実行した結果が下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 1 | 2020-07-26 14:00:00 | +------+---------------------+
完全一致のデータのみ取得可能
同一日付のデータを取得したい場合と記述しましたが、「=(イコール)」演算子では完全一致したデータのみしか取得出来ません。
例えば下記のように、時刻が異なる場合、同一日付でもデータを取得出来ません。
SELECT * FROM test1 WHERE date = '2020-07-26 14:30:00';
同じく下記のように、日付のみを指定した場合にも同一データ無しと判定されます。
SELECT * FROM test1 WHERE date = '2020-07-26';
日付のみで判定するためには?
ではDATETIME型で格納されたデータを日付のみで判定するためには、どうするのかというとMySQLの場合、DATE_FORMAT関数を利用することで実現可能です。
SELECT * FROM test1 WHERE DATE_FORMAT(date, '%Y-%m-%d') = DATE_FORMAT(now(), '%Y-%m-%d');
これでテーブルに格納された日時と現在日時を日付のみの同じフォーマットに変換しています。
実行した結果は下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 4 | 2020-07-29 15:00:00 | +------+---------------------+
SQLの日付比較2: 以前の日付
SQLで指定した日付以前のデータを取得したい場合には「<(小なり)」または「<=(小なりイコール)」演算子を利用します。
サンプル
今回のサンプルでは「2020-07-29 00:00:00」の日付以前のデータを取得してみたいと思います。
SELECT * FROM test1 WHERE date < '2020-07-29 00:00:00';
実行した結果が下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 1 | 2020-07-26 14:00:00 | | 2 | 2020-07-27 13:00:00 | | 3 | 2020-07-28 14:00:00 | +------+---------------------+
SQLの日付比較3: 以降の日付
SQLで指定した日付以降のデータを取得したい場合には「>(大なり)」または「>=(大なりイコール)」演算子を利用します。
サンプル
今回のサンプルでは「2020-07-28 14:00:00」の日付以降のデータ(同一日時を含む)を取得してみたいと思います。
SELECT * FROM test1 WHERE date >= '2020-07-28 14:00:00';
実行した結果が下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 3 | 2020-07-28 14:00:00 | | 4 | 2020-07-29 15:00:00 | | 5 | 2020-08-28 14:00:00 | | 6 | 2021-07-28 14:00:00 | +------+---------------------+
SQLの日付比較4: 期間内の日付
SQLで指定した期間内の日付データを取得したい場合には「BETWEEN」を利用します。
短期集中でWebエンジニアになれるスクール
サンプル
今回のサンプルでは「2020年7月」のデータを取得してみたいと思います。
「WHERE カラム名 BETWEEN 日付 AND 日付」で指定した2つの日付期間内のデータを取得します。
SELECT * FROM test1 WHERE date BETWEEN '2020-07-01 00:00:00' AND '2020-07-31 23:59:59';
実行した結果が下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 1 | 2020-07-26 14:00:00 | | 2 | 2020-07-27 13:00:00 | | 3 | 2020-07-28 14:00:00 | | 4 | 2020-07-29 15:00:00 | +------+---------------------+
SQLの日付比較5: 期間外の日付
SQLで指定した期間内の日付データ以外を取得したい場合には「NOT BETWEEN」を利用します。
サンプル
今回のサンプルでは「2020年8月以外」のデータを取得してみたいと思います。
「WHERE カラム名 NOT BETWEEN 日付 AND 日付」で指定した2つの日付期間内のデータ以外を取得します。
SELECT * FROM test1 WHERE date NOT BETWEEN '2020-08-01 00:00:00' AND '2020-08-31 23:59:59';
実行した結果が下記の通りです。
+------+---------------------+ | id | date | +------+---------------------+ | 1 | 2020-07-26 14:00:00 | | 2 | 2020-07-27 13:00:00 | | 3 | 2020-07-28 14:00:00 | | 4 | 2020-07-29 15:00:00 | | 6 | 2021-07-28 14:00:00 | +------+---------------------+
さいごに:SQLの日付比較はデータベースを扱う上での必須知識
本記事では、SQLの日付比較でデータを取得する方法についてご紹介してきました。
データベースを扱う上で日付を指定してデータを取得するケースは頻繁に訪れます。
しっかりと処理内容を理解して、適切なデータを取得出来るよう繰り返し練習してみましょう。
SQLを学んでWebエンジニアを目指そう
Webエンジニアは、Webサービスを作るエンジニアで非常に人気の高い職種です。
スタートアップやベンチャー企業が中心なので柔軟性のある雇用形態、魅力的な作業環境、面白いプロジェクト、高い報酬など非常に魅力的な求人が多いです。
Ruby on RailsやGo言語を用いたプロジェクトが多く、SQLも重要なスキルとなります。
このブログを運営するプログラミングスクールのポテパンキャンプでは、実践的なカリキュラムと現役エンジニアからのレビュー、そしてポートフォリオ添削や模擬面談などの面談転職サポートにより、最短距離でWebエンジニアを目指すことができます。
Webエンジニアへの転職を考えている方は、是非一度無料カウンセリングへお申込みください。
本記事では、MySQLを使用して動作確認を行っています。
サンプルで使用している関数などはデータベース毎に異なりますので、読み替えが必要です。