Skip to content

Instantly share code, notes, and snippets.

@dakatsuka
Created March 4, 2012 07:12
Show Gist options
  • Save dakatsuka/1971098 to your computer and use it in GitHub Desktop.
Save dakatsuka/1971098 to your computer and use it in GitHub Desktop.
24時間を超えるMySQLのTIME型をRailsで扱うには

24時間を超えるMySQLのTIME型をRailsで扱うには

次のような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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment