列同士を比較する
datetime型をそのままプラス・マイナスしてはいけません!!
例えば、
mysql> select * from test; +---------------------+---------------------+ | start | end | +---------------------+---------------------+ | 2013-05-16 11:59:48 | 2013-05-16 12:00:31 | +---------------------+---------------------+ 1 row in set (0.00 sec) mysql> select end - start from test; +-------------+ | end - start | +-------------+ | 4083.000000 | +-------------+ 1 row in set (0.00 sec)
恐らく普通に考えて想定される結果は、43秒なのではないでしょうか?
なぜ4083になるかというと、
2013-05-16 12:00:31 は 20130516120031
2013-05-16 11:59:48 は 20130516115948
そのため
20130516120031 - 20130516115948 = 4083
となっているためです。
この結果は誰も求めていはいないはずです。
時間の差分を求める場合には、必ずtimediff関数を使用しましょう。
mysql> select timediff(end,start) from test; +---------------------+ | timediff(end,start) | +---------------------+ | 00:00:43 | +---------------------+ 1 row in set (0.01 sec)
さらに時間を秒に直したい場合には、time_to_secを使用しましょう。
mysql> select time_to_sec(timediff(end,start)) from test; +----------------------------------+ | time_to_sec(timediff(end,start)) | +----------------------------------+ | 43 | +----------------------------------+ 1 row in set (0.00 sec)
timediffを使用しなければ、時間や日付をまたいだ場合に思わぬ結果になってしまいます!!
特定の時間を加減算する
列同士の比較にはtimediff関数でしたが、
指定した時間を加減算する場合にはaddtimeを使用します。
下記は10分前を求めている例です。
mysql> select now(),addtime(now(),'-00:10:00'); +---------------------+----------------------------+ | now() | addtime(now(),'-00:10:00') | +---------------------+----------------------------+ | 2013-05-17 06:13:49 | 2013-05-17 06:03:49 | +---------------------+----------------------------+ 1 row in set (0.00 sec)