MySQLで期間限定のデータを取得するSQL文を書いてみよう
presented by 役に立つかもしれないBlog
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サーバーでクエリ履歴をログファイルに保存する方法
- MySQLで「ALTER TABLE ... DROP INDEX」すると「Error 150」が出る問題
- タグ機能を実現するための便利なデータベース設計を3つ紹介
- さくらのVPSのPHP+MySQLを最新のものにアップデート。
- JavaScriptでDATETIME型の日付を得る方法
- MySQL(innoDB)でリレーション設定時に「インデックスは設定されていません」エラー
- MySQLでRANDOMな数値を得る方法
- MySQLのunique属性で大文字や小文字が区別されない問題を解決
- MySQLの「Can't create/write to file '/tmp/#sql****.MYI'」エラーを解決する!
- MySQLで画像を格納時にエラーが発生する3つの要注意ポイント
- MySQLでHAVING指定したら「Unknown column ... in 'having clause'」エラー



コメントフォーム