MySQLで期間限定のデータを取得するSQL文を書いてみよう
MySQLでWebアプリケーションを構築する場合に、たまにやりたいことの1つに「登録日から○○日はお試し期間です」といったような「期間限定」機能がありますね。
今回はこの期間限定をSQLでどう書くかを書いていきたいと思います。
テーブル構成
- テーブル名:user
- フィールド名:registered
このuser.registeredについては、DATE型で入れてあったり、DATETIME型で入れてあったりしますね。
登録日から30日までは無料です
こういった条件でユーザーを抽出したい場合は、「DATE_ADD()」に「INTERVAL」キーワードを使うのが良いですね。
DATETIME型の場合
登録日をDATETIME型で構成しているときに、気になるところは時刻の扱いです。
厳密に時刻を指定したいオークション的なものであれば時刻も含めて30日を追加しないといけないので次のようになります。
SELECT * FROM user WHERE DATE_ADD(register, INTERVAL 30 DAY) > NOW();
30日後の日付が変わる間は期間限定、の場合
よくあるのが「30日いっぱいは期間限定」といった場合ですね。 この場合は時刻は関係ないのでDATETIME型であっても、日付だけを見て比較するSQL文になります。
SELECT * FROM user WHERE DATE_ADD(DATE(register), INTERVAL 30 DAY) > CURDATE();
ポイントはDATETIME型のregisterをDATE()で日付だけに変換してる点と、現在の時間をCURDATE()にしているところですね。
DATE型の場合
DATE型にしている人はほとんどいないと思いますが、念のため。
DATE型の場合は、時刻を使わないので、そのままCURDATE()を利用します。
SELECT * FROM user WHERE DATE_ADD(registered, INTERVAL 30 DAY) > CURDATE();
○○日前も簡単に調べられる
たとえば「30日前」という条件についても、マイナス記号を使って次のように調べられます。
SELECT * FROM user WHERE DATE_ADD(registered, INTERVAL -30 DAY) ...
INTERVAL はちゃんと月末が何日あるかとかも判断して計算してくれるので非常に便利なキーワードですよ。
【当記事を読んだ方におすすめの書籍】
MySQL徹底入門 第4版 MySQL 8.0対応
¥2,090 (2025-04-17 23:18 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)MySQL運用・管理[実践]入門 〜安全かつ高速にデータを扱う内部構造・動作原理を学ぶ
¥3,018 (2025-04-17 07:46 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)3ステップでしっかり学ぶ MySQL入門[改訂第3版]
¥2,860 (2025-04-17 07:46 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)2010-11-04