OneDay

40歳からプログラマとして生活しています。

Rails 誕生日のユーザーを抽出する database: MySQL

ユーザーが誕生日情報を持っているテーブルがあるとします。

Table: users
Field: birthday

このbirthdayのデータ型はMySQL:date, Ruby:Dateで設定すると思います。しかし、このbirthdayには年の要素が入っていて、明日が誕生日の人を抽出する、今月が誕生日の人を抽出するときにはbirthdayを生のまま使用できません。"birthday"の月や日を抽出することを考える必要があるようです。


MySQL :: MySQL 5.6 Reference Manual :: 12.7 Date and Time Functions
MySQLのリファレンスを見るとDAYOFMONTH(date),MONTH(date)があり以下のように使用できます。

mysql> SELECT DAYOFMONTH('2015-11-12');
+--------------------------+
| DAYOFMONTH('2015-11-12') |
+--------------------------+
|                       12 |
+--------------------------+
1 row in set (0.00 sec)

mysql> SELECT MONTH('2015-11-12');
+---------------------+
| MONTH('2015-11-12') |
+---------------------+
|                  11 |
+---------------------+
1 row in set (0.01 sec)


Railsモデル(ActiveRecord)のwhereメソッド条件式に組み入れると指定する誕生日でユーザーを抽出することができるようになります。

# pry
#11月13日の誕生日の人を抽出する
tgt = Date.new(2015,11,13)
User.where('MONTH(birthday)=? AND DAYOFMONTH(birthday)=?', tgt.month, tgt.day)
  User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE (MONTH(birthday)=11 AND DAYOFMONTH(birthday)=13)

#11月が誕生日の人を抽出する
User.where('MONTH(birthday)=?', tgt.month)
 User Load (0.7ms)  SELECT `users`.* FROM `users` WHERE (MONTH(birthday)=11)

これで抽出することが出来ました。もっと適切な手段をご存知の方はご教授いただけるとありがたいです。
MYSQLのDAYOFMONTH(date)はDay(date)でも使用可能です。