質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

MySQL PHP 時刻計算 足し算

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,435

score 493

テストデータとテーブル構造

In TIME
Out TIME
date DATE
[A]
|In|Out|date|
|12:00:00|13:00:00|2017-05-19|

[B]
|In|Out|date|
|12:00:00|12:30:00|2017-05-19|
|12:00:00|12:45:00|2017-05-19|

得たい結果

$result = (Out - In) + (Out - In)・・・・
上記のテストデータであれば、、、
[A] $result = Out(13:00:00) - In(12:00:00) = 01:00:00
[B] $result = (Out(12:30:00) - In(12:00:00)) + (Out(12:45:00) - In(12:00:00)) = 01:15:00

やってみたこと

SELECT SUM(TIMEDIFF(Out, In)) AS value FROM table WHERE date = ?


見てみると、この計算って
12:00:00を120000として計算しているのかな?と思います。
今回の結果としては
[A] $result = 'value' => 10000
[B] $result = 'value' => 7500

こういった結果事態は取得することはできたのですが、、、
どうも時刻に戻す方法がうまくいっていません。

とりあえず力技かと思いますが、下記の方法を試しました

$result = sprintf('%06d', $result); // 010000, 007500
$result = date('H:i:s', strtotime($result)); // 01:00:00, 09:00:00


まぁ、単純な話下4桁が6000未満でないと結果としては、不十分なことになります。

アプローチの仕方も別の視点がもっとわかりやすいかもしれませんが、それらも踏まえて現状において、時刻が取得できるようにするにはどのような方法が考えられるでしょうか?

やってみたこと(追加)

一応表現はできましたが、力技な気もします、、、

$time = '7500';
// とりあえず6桁にそろえます
$time = sprintf('%06d', $time); // 007500

// 次に2桁ずつ分解します
$T[] = str_split($time, 2); // $T[0][0] = 00, $T[0][1] = 75, $T[0][2] = 00

// $T[0][1]の値によってデータをいじります
if($T[0][1] >= 60) {
  $T[0][0]++;
  $T[0][1] = sprintf('%02d', $T[0][1] - 60);
  $time = sprintf('%06d', $T[0][0].$T[0][1].$T[0][2]);
}

// 数字を時刻へ
$time = date('H:i:s', strtotime($time));
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m6u

    2017/05/19 19:10

    データを格納しているテーブルのデータ構造を、データ型も添えて示してください。時刻だからTIME型を使っていると考えてよいのかな?

    キャンセル

  • Z-TALBO

    2017/05/19 19:23

    その通り、TIME型になります

    キャンセル

回答 2

checkベストアンサー

+2

秒にして計算するのではどうでしょう

SELECT SEC_TO_TIME(SUM(TIMESTAMPDIFF(SECOND,IN,OUT))) FROM table WHERE date = ?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/20 08:26

    回答ありがとうございます!

    SQL側一発で表現したい結果となりました。
    SEC_TO_TIMEなどは見つけてはみたのですが、使い方が悪くどうもうまくいっていませんでしたが、今回のTIMESTAMPDIFFなども、なるほど、TIMEDIFFじゃなくても、、、ということがわかりました。

    キャンセル

+1

秒単位でSUM()する方法の事例がありました。

MySQLのtime型の合計 - Qiita

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/20 08:26

    回答ありがとうございます。

    大変参考になる事例を提示していただき感謝です!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る