MySQLクエリで日付範囲検索時に年を無視する方法
MySQLクエリで日付範囲検索時に年を無視する方法
MySQLで日付の範囲検索を行う際に「年」を無視したい場合は、DATE_FORMAT()関数とBETWEEN句を組み合わせるのが効果的です。日付を「月-日」の形式に変換して比較することで、年に関係なく特定の期間に該当するレコードを抽出できます。
ここでは、実際にデモテーブルを作成して動作を確認していきましょう。
1. サンプルテーブルを作成する
まずは出荷日(ShippingDate)を格納するテーブルを作成します。以下がテーブル作成のクエリです。
mysql> create table igonreYearDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ShippingDate date
-> );
Query OK, 0 rows affected (0.75 sec)2. テーブルにレコードを挿入する
次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。以下がそのクエリです。
mysql> insert into igonreYearDemo(ShippingDate) values('2016-01-31');
Query OK, 1 row affected (0.16 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2018-01-31');
Query OK, 1 row affected (0.13 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2015-06-23');
Query OK, 1 row affected (0.17 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2015-06-23');
Query OK, 1 row affected (0.15 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2014-02-01');
Query OK, 1 row affected (0.20 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2019-01-31');
Query OK, 1 row affected (0.16 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2019-02-14');
Query OK, 1 row affected (0.11 sec)
mysql> insert into igonreYearDemo(ShippingDate) values('2019-03-12');
Query OK, 1 row affected (0.19 sec)3. テーブルの全レコードを表示する
SELECT文ですべてのレコードを表示してみましょう。以下がそのクエリです。
mysql> select *from igonreYearDemo;
実行結果は次のとおりです。
+----+--------------+ | Id | ShippingDate | +----+--------------+ | 1 | 2016-01-31 | | 2 | 2018-01-31 | | 3 | 2015-06-23 | | 4 | 2015-06-23 | | 5 | 2014-02-01 | | 6 | 2019-01-31 | | 7 | 2019-02-14 | | 8 | 2019-03-12 | +----+--------------+ 8 rows in set (0.00 sec)
4. 年を無視して日付範囲で抽出するクエリ
それでは本題の、年を無視して日付範囲でレコードを取得するクエリを見ていきましょう。DATE_FORMAT()関数にフォーマット指定子 '%m-%d' を渡すことで、日付を「月-日」形式の文字列に変換できます。この値をBETWEEN句で比較することにより、年の違いに関係なく「1月1日~3月31日」の間に該当するレコードのみを抽出できます。
mysql> select *from igonreYearDemo tbl where DATE_FORMAT(tbl.ShippingDate, '%m-%d') between '01-01' and '03-31';
実行結果は次のとおりです。
+----+--------------+ | Id | ShippingDate | +----+--------------+ | 1 | 2016-01-31 | | 2 | 2018-01-31 | | 5 | 2014-02-01 | | 6 | 2019-01-31 | | 7 | 2019-02-14 | | 8 | 2019-03-12 | +----+--------------+ 6 rows in set (0.00 sec)
実行結果のポイント
上記の出力を見ると、年が異なる複数のレコード(2014年・2016年・2018年・2019年)がすべて抽出されていることがわかります。一方、6月23日のレコード(Id: 3, 4)は範囲外のため除外されました。
この手法は、「誕生日が特定の期間内にある会員を毎年抽出したい」「過去の売上データから特定の季節の傾向を分析したい」といったケースで特に便利です。ただし、大量のデータを扱う場合、DATE_FORMAT()による関数処理ではインデックスが利用されずパフォーマンスが低下する可能性がある点に注意してください。速度が重視されるシステムでは、月と日を別カラムで管理する設計も検討するとよいでしょう。
-
MySQLクエリで日付・時刻の値を秒単位で加算(インクリメント)する方法
MySQLで日付・時刻(DATETIME)の値に指定した秒数を加算したい場合は、DATE_ADD()関数とINTERVAL句を組み合わせて使用します。この記事では、実際にテーブルを作成し、秒単位で時刻をインクリメントする手順を具体例とともに解説します。 サンプルテーブルの作成 まず、DATETIME型のカラムを持つテーブルを作成しましょう。 mysql> create table DemoTable1867 ( ArrivalTime datetime &
-
MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方
MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ