ユーザーの登録日や誕生日のみの情報が欲しく、登録年は考慮しない
今日基準から何日間、という判定
要するに、
「現在日から N日以内に誕生日を迎えるユーザーを抽出したい」
と言うことでしょうか?
であれば、例えば 30日以内に誕生日を迎えるユーザーを抽出する場合、以下のような SQL文で実現できます。
sql
1SELECT *
2FROM A
3WHERE MAKEDATE(YEAR(CURDATE()) , DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)
4 OR MAKEDATE(YEAR(CURDATE()) + 1, DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY);
参考:
http://stackoverflow.com/questions/8812280/birthdays-dates-between-two-months
実行結果
sql
1mysql> CREATE TABLE A (MMDD DATE);
2Query OK, 0 rows affected (0.02 sec)
3
4mysql> INSERT INTO A VALUES ('2000-01-01'), ('1990-05-12'), ('2010-06-11'), ('1980-06-12'), ('2017-02-01');
5Query OK, 5 rows affected (0.00 sec)
6Records: 5 Duplicates: 0 Warnings: 0
7
8mysql> SELECT * FROM A;
9+------------+
10| MMDD |
11+------------+
12| 2000-01-01 |
13| 1990-05-12 |
14| 2010-06-11 |
15| 1980-06-12 |
16| 2017-02-01 |
17+------------+
185 rows in set (0.00 sec)
19
20mysql> SELECT *
21 -> FROM A
22 -> WHERE MAKEDATE(YEAR(CURDATE()) , DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)
23 -> OR MAKEDATE(YEAR(CURDATE()) + 1, DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY);
24+------------+
25| MMDD |
26+------------+
27| 1990-05-12 |
28| 2010-06-11 |
29+------------+
302 rows in set (0.00 sec)
31
32mysql> SELECT *
33 -> FROM A
34 -> WHERE MAKEDATE(YEAR(CURDATE()) , DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 250 DAY)
35 -> OR MAKEDATE(YEAR(CURDATE()) + 1, DAYOFYEAR(MMDD)) BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 250 DAY);
36+------------+
37| MMDD |
38+------------+
39| 2000-01-01 |
40| 1990-05-12 |
41| 2010-06-11 |
42| 1980-06-12 |
43+------------+
444 rows in set (0.00 sec)
2017/05/11 23:06