プログラミング

LaravelでMySQLのTIME型の合計を集計する方法

MySQLのTIME型をふつうにSUM関数で集計すると、意図したような集計結果になりません。

以下、解決策を共有します。

前提

以下のテーブルがあったとします。

training_nametraining_time
ベンチプレス11:50:00
ベンチプレス01:40:00
trainingテーブル

期待する値

上記のテーブルのtraining_timeはTIME型です。

合計値として取得する期待値は 13:30:00 です。

失敗する方法

しかし、以下のようにシンプルにsumで取得すると、残念ながら期待する値とはならず、

129000 となってしまいます。

$training_time = Training::where('training_name', 'ベンチプレス')->sum('training_time');

dd($training_time);

解決方法

以下のように、MySQLのTIME_TO_SEC関数で一度秒に変換することで期待する集計結果を取得することが可能です。

秒に変換 -> 集計 -> 時間に変換 の順で処理をしています。

なお、selectRawを使うことでLaravelで自由なSQLを記述することが可能です。

$training = Training::selectRaw('SEC_TO_TIME(SUM(TIME_TO_SEC(training_time))) as total_time')
      ->where('training_name','ベンチプレス')
      ->first();

dd($training->total_time);

TIME型ってクセがありますね。。。

COMMENT

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

CAPTCHA