PHP+MySQLを利用していて、DATETIME型のカラムに対して、直接、加算・減算をしたSQLの条件を指定したい場合の方法について覚書しておきます。
もちろん、PHPで日時計算をして、変数に代入してからSQLに組み込むなどしても日時の加算・減算の条件付けはできるのですが、SQLの発行時点で加算・減算した方が楽に操作できます。
MySQLの公式マニュアルにも記述があるのですが、MySQLのマニュアルは読みづらいと思うので要点をまとめてみました。
(参考)公式マニュアル
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html
該当するのはDATE_ADD
DATE_SUBの箇所です。
分かりづらいので、具体的なSQLを組んでみます。
"SELECT count(id) as cnt FROM table
WHERE (date > (NOW() - INTERVAL 60 SECOND)",
上記SQLは、dateカラムにある値が、現在時刻から60秒前以降の値のものを抽出して、そのidの数を数えるというものです。
ポイントは、INTERVAL です。
INTERVALの前にマイナス-・プラス+記号をつけることで、減算・加算ができます。
+(-) INTERVAL 数値 単位 という構文になります。
単位は、
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
など様々なものが使えます。公式マニュアルに詳しく載っているので参考にしてください。
加算・減算の対象となるのは、NOW()関数だけではなく、DATETIME型の具体的な数値でもOKなようです。
もう一つの方法は、DATE_ADD()、DATE_SUB() 関数を使用する方法です。
(date >= DATE_SUB(CURDATE(), INTERVAL 10 DAY))
CURDATE()関数は今日の年月日を返します。10 DAY の部分に日時に対応するものを置くと、日時を加算・減算することができます。
上記例では、今日の日付から 10日前の年月日を返すことになります。
ちなみに、INTERVALを利用せず、
NOW()-60
などとしてもエラーにならず値を取得することができます。
ただし、-60ならば、60秒前となりますが、-100とすると100秒前ではなく、1分前となります。DATETIMEを数値の羅列にしたものから100を引く計算になるので1分前となるわけです。
混乱を避けるためにも、INTERVALを利用した方がよさそうです。