例えばこういう場面
- 現在月のレコードだけ取得したい
- 特定の日付のレコードだけ取得したい
その方法は意外と簡単でした。
そこで自分へのメモも兼ね、
MySQLで月ごと・日ごとのレコード取得方法を紹介
ここで想定するMySQLテーブルの構成例
こういうテーブルを作ったとします。
▼ テーブル作成のSQL例
1 2 3 4 5 6 |
CREATE TABLE users ( id INT AUTO_INCREMENT, name VARCHAR(100), joined_on DATETIME, PRIMARY KEY(id) ); |
名前と登録日時だけを持つ、簡単なユーザーテーブルです。ここで重要になってくるのが登録日時の joined_on カラムです。このDATETIME値を元に月ごと・日ごとの絞り込みをすることになります。
そして適当にレコードを挿入
▼ このようなSQLで3件だけ挿入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
INSERT INTO users ( name, joined_on ) VALUES ( 'Hoge', '2020-10-06 12:09:29' ); INSERT INTO users ( name, joined_on ) VALUES ( 'Fuga', '2020-11-17 18:19:59' ); INSERT INTO users ( name, joined_on ) VALUES ( 'Piyo', '2020-12-01 07:08:41' ); |
▼ テーブルの表示結果
id | name | joined_on |
---|---|---|
1 | Hoge | 2020-10-06 12:09:29 |
2 | Fuga | 2020-11-17 18:19:59 |
3 | Piyo | 2020-12-01 07:08:41 |
このテーブルを元に説明していきます。
特定の月ごとの条件でレコード取得
まずは月ごとのレコード取得について
これには次の2つの関数が必要です。
▼ 1つめはMONTH関数
MONTH(date)
1 (1 月) から 12 (12 月) の範囲内で、date に対応する月を返します。'0000-00-00' や '2008-00-00' のように月の部分がゼロの場合は、0 を返します。
引用元 : https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_month
▼ 2つめはYEAR関数
YEAR(date)
1000 から 9999 までの範囲内で、date に対応する年を返します。日付が「ゼロ」の場合は、0 を返します。
引用元 : https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_year
これでアレコレすればできます。
実際には次のようなSQLを書いてみました。
▼ 11月のレコードのみ取得
1 2 3 |
SELECT * FROM users WHERE MONTH(joined_on) = 11 AND YEAR(joined_on) = YEAR(CURRENT_DATE()); |
▼ レコードの取得結果
id | name | joined_on |
---|---|---|
2 | Fuga | 2020-11-17 18:19:59 |
ポイントはWHERE句に対して MONTH(joined_on) = 11 として登録月が11月、そして YEAR(joined_on) = YEAR(CURRENT_DATE()) として現在年を指定していることです。大事なのはそれだけ
もちろん現在月での取得も可能です。
▼ こういうSQLを書けばOK
1 2 3 |
SELECT * FROM users WHERE MONTH(joined_on) = MONTH(CURRENT_DATE()) AND YEAR(joined_on) = YEAR(CURRENT_DATE()); |
先ほどの MONTH(joined_on) = 11 のところを MONTH(joined_on) = MONTH(CURRENT_DATE()) として現在月での比較にするだけです。
特定の日という条件でレコード取得
先ほどは月ごとのレコード取得でした。
でも当然ながら日ごとの取得も可能です。
例えば次のようなSQLを書けばできます。
▼ 12月01日のみのレコードを取得
1 2 3 4 |
SELECT * FROM users WHERE DAY(joined_on) = 01 AND MONTH(joined_on) = 12 AND YEAR(joined_on) = YEAR(CURRENT_DATE()); |
▼ レコードの取得結果
id | name | joined_on |
---|---|---|
3 | Piyo | 2020-12-01 07:08:41 |
これだけ。簡単です。
ちなみに現在日での取得もできます。
▼ このようなSQLで取得可能
1 2 3 4 |
SELECT * FROM users WHERE DAY(joined_on) = DAY(CURRENT_DATE()) AND MONTH(joined_on) = MONTH(CURRENT_DATE()) AND YEAR(joined_on) = YEAR(CURRENT_DATE()); |
単純に現在年・月・日を比べるだけです。
色々な場面で使えそうだし、汎用性も高そう。
まとめ - 月ごとのレコード取得は色々な場面で使える
こういう風に月・日ごとのレコード取得は簡単です。
特に月ごとはこういう場面で使うことが多いかも
- 月ごとにレコードをまとめたり、
- 特定月のランキングを生成したり、
もちろんSQLを工夫すれば年ごとでも可能です。
以上、MySQLでの月・日ごとレコード取得でした。
間違いがあればご指摘を。ではまた