MySQLで日付フィールドの日と月だけを比較する方法
MySQLでは、DATE_FORMAT()関数を活用することで、日付フィールドの「日」と「月」だけを比較できます。年を無視して誕生日や記念日などの同じ月日を検索したい場合に非常に便利なテクニックです。
基本構文
日と月のみを比較するための基本的な構文は以下のとおりです。
select *from yourTableName
WHERE DATE_FORMAT(yourColumnName, '%m-%d') = DATE_FORMAT('yourValue', '%m-%d') and yourCondition;DATE_FORMAT()の書式指定子「%m」は月、「%d」は日を表します。両辺を「月-日」の形式に変換して比較することで、年を除外した照合が可能になります。
サンプルテーブルの作成
それでは、実際に動作を確認するためにテーブルを作成してみましょう。テーブル作成のクエリは次のとおりです。
mysql> create table compareDayAndMonthDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> compareDayAndTime date
-> );
Query OK, 0 rows affected (0.49 sec)レコードの挿入
次に、insertコマンドを使ってテーブルにいくつかのレコードを挿入します。
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2014-01-31');
Query OK, 1 row affected (0.20 sec)
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2014-10-11');
Query OK, 1 row affected (0.16 sec)
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2016-09-12');
Query OK, 1 row affected (0.08 sec)
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2017-04-25');
Query OK, 1 row affected (0.08 sec)
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2018-12-25');
Query OK, 1 row affected (0.08 sec)
mysql> insert into compareDayAndMonthDemo(compareDayAndTime) values('2019-02-27');
Query OK, 1 row affected (0.07 sec)テーブルの全レコードを表示
select文を使って、テーブル内のすべてのレコードを表示します。
mysql> select *from compareDayAndMonthDemo;
実行結果は以下のとおりです。
+----+-------------------+ | Id | compareDayAndTime | +----+-------------------+ | 1 | 2014-01-31 | | 2 | 2014-10-11 | | 3 | 2016-09-12 | | 4 | 2017-04-25 | | 5 | 2018-12-25 | | 6 | 2019-02-27 | +----+-------------------+ 6 rows in set (0.00 sec)
日と月のみを比較するクエリ
ここで、日と月だけを比較するクエリを実行してみます。比較対象として「2019-01-31」を指定し、条件としてId=1を追加しています。
mysql> select *from compareDayAndMonthDemo
-> WHERE DATE_FORMAT(compareDayAndTime, '%m-%d') = DATE_FORMAT('2019-01-31', '%m-%d') and Id=1;実行結果は以下のとおりです。
+----+-------------------+ | Id | compareDayAndTime | +----+-------------------+ | 1 | 2014-01-31 | +----+-------------------+ 1 row in set (0.00 sec)
ご覧のとおり、年が異なる「2014-01-31」のレコードが「2019-01-31」と一致して抽出されました。これは月と日だけが比較されていることを示しています。
日と月のみを結果として取得する方法
比較結果として、日と月だけを表示したい場合は、以下のクエリを使用します。
mysql> select DATE_FORMAT(compareDayAndTime, '%m-%d') AS DayAndMonthOnly from compareDayAndMonthDemo
-> WHERE DATE_FORMAT(compareDayAndTime, '%m-%d') = DATE_FORMAT('2019-01-31', '%m-%d') and Id=1;実行結果は以下のとおりです。
+-----------------+ | DayAndMonthOnly | +-----------------+ | 01-31 | +-----------------+ 1 row in set (0.00 sec)
補足:パフォーマンスに関する注意点
WHERE句でDATE_FORMAT()のようにカラムに対して関数を適用すると、インデックスが利用できず、大規模なテーブルでは検索が遅くなる可能性があります。パフォーマンスが重要な場合は、月と日を格納する生成カラム(GENERATED COLUMN)を作成してインデックスを張る、あるいはMONTH()関数とDAY()関数を組み合わせる方法も検討するとよいでしょう。
-
MySQLで現在の日付の月・日と比較してレコードを取得する方法
はじめにMySQLで、現在の日付の「月」と「日」が一致するレコードだけを抽出したいケースはよくあります。例えば、記念日や誕生日のように年に関係なく同じ日付のデータを取得したい場合に便利です。このような場合には、MONTH()関数とDAY()関数を組み合わせて使用します。ここでは、実際にテーブルを作成し、データを挿入して、現在の日付と月日を比較してレコードを取得する手順を解説します。サンプルテーブルの作成まず、記念日を格納するテーブルを作成します。mysql> create table DemoTable1429 -> ( &n
-
【MySQL】日付レコードから曜日を減算し、曜日名とともに結果を表示する方法
はじめにMySQLで保存された日付レコードから、その週の開始日(月曜日)を計算して減算し、曜日名とともに結果を表示したい場合があります。このような処理には DATE_FORMAT() 関数を使用します。SUBDATE() と WEEKDAY() を組み合わせることで、各日付が属する週の月曜日の日付を「Mon 19 Oct」のような形式で取得できます。以下、具体的な手順をサンプルコードとともに解説します。1. テーブルの作成まず、日付を文字列として格納するテーブルを作成します。mysql> create table DemoTable1820 ( AdmissionDate