【MySQL】SQL発行時に日時計算(加算・減算)する方法

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を利用した方がよさそうです。

カテゴリー: SQL パーマリンク

コメントを残す

メールアドレスが公開されることはありません。