次のようなtimecards
テーブルがあったとする。
+----+------------+---------------------+---------------------+
| id | date | start_time | end_time |
+----+------------+---------------------+---------------------+
| 1 | 2012-02-27 | 2012-02-27 09:00:00 | 2012-02-28 10:00:00 |
| 2 | 2012-02-29 | 2012-02-29 09:00:00 | 2012-02-29 17:00:00 |
+----+------------+---------------------+---------------------+
このテーブルで開始時刻と終了時刻の差分を取るにはTIMEDIFF
関数を使うと便利。
SELECT id, date, TIMEDIFF(end_time, start_time) AS total FROM timecards;
結果はこんな感じ。
+----+------------+----------+
| id | date | total |
+----+------------+----------+
| 1 | 2012-02-27 | 25:00:00 |
| 2 | 2012-02-29 | 08:00:00 |
+----+------------+----------+
しかしこの結果をActiveRecordで取得しようと思った場合、time out of range
エラーが起こる。
原因は単純で、MySQLのTIME型が -838:59:59 〜 838:59:59 の範囲を扱えるのに対し、RubyのTimeクラスは24時間までしか扱えないから。
そもそもTimeクラスは時刻を扱うクラスであって、時間の範囲を扱う訳では無いので致し方無いのかな。
とりあえず今回は差分を取得出来れば良かったのでCAST
関数でお茶を濁す事にした。
SELECT id, date, CAST(TIMEDIFF(end_time, start_time) AS CHAR) AS total FROM timecards