MySQLで期間や経過時間を取得する

仕事である要求があった。ある行動をとってから、何時間経過しているか分かるようにしてほしい、と。
ある行動というのは、行動した時間をレコードに記録してある。その時刻から今まで何時間過ぎたか計測できればいいわけ。データを取得してからプログラムを使えば簡単かなぁとは思ったのだけど、期間を計測する関数くらいありそうなので調べてみた。


まずは単純な考えで、関数なくてもできると思ったのです。MySQLは同じ型なら計算できるので、now()で現在時間を取得して、行動時間を引けばいいと思ったのです。

SELECT NOW() - '2010-07-20 18:00:00';
 >877951.000000

思ったとおりにいかない。now()の結果も2010-07-20 20:00:00という形だからいけると思ったのだけど。


時刻関数を探すしかない。そして、発見。

TIMEDIFF(expr, expr2)

というのが構文。バージョンはMySQL 4.1.1から使えるらしい。この関数でも、時刻系で型が同じなことが使える条件。

SELECT TIMEDIFF( NOW(), '2010-07-20 20:00:00');
 >11:47:30

11時間47分30秒が経過しました、または2つの時刻は11時間47分30秒間ですという意味。あとは普通にテーブルからデータを取得しつつ、この関数を使えばできる。例えば、

SELECT action, TIMEDIFF(now(), action_datetime) FROM action_tbl

これで行動名と経過時間を一覧で全部取得できる。WHERE句をつけて、user_idでしぼるとか、ある特定の行動だけ表示するとか、なんでもできる。そういう風なテーブルを作成しておく必要があるけど。
使えそうな実例としては、何時間ぶりのログインかの表示とか。スケジュールの空き時間とか、就寝時刻と起床時刻をとれば睡眠時間が計算できるとか。工夫とデータの取り方次第だと思う。
注意は、経過時間が838:59:59以上は測れないこと。理由はよく分からないのだけど、TIME型の範囲と同じなので関係あるのかもしれない。