###テストデータとテーブル構造
In TIME Out TIME date DATE
MySQL
1[A] 2|In|Out|date| 3|12:00:00|13:00:00|2017-05-19| 4 5[B] 6|In|Out|date| 7|12:00:00|12:30:00|2017-05-19| 8|12:00:00|12:45:00|2017-05-19| 9
###得たい結果
$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
###やってみたこと
MySQL
1SELECT SUM(TIMEDIFF(Out, In)) AS value FROM table WHERE date = ?
見てみると、この計算って
12:00:00を120000として計算しているのかな?と思います。
今回の結果としては
[A] $result = 'value' => 10000
[B] $result = 'value' => 7500
こういった結果事態は取得することはできたのですが、、、
どうも時刻に戻す方法がうまくいっていません。
とりあえず力技かと思いますが、下記の方法を試しました
PHP
1$result = sprintf('%06d', $result); // 010000, 007500 2$result = date('H:i:s', strtotime($result)); // 01:00:00, 09:00:00
まぁ、単純な話下4桁が6000未満でないと結果としては、不十分なことになります。
アプローチの仕方も別の視点がもっとわかりやすいかもしれませんが、それらも踏まえて現状において、時刻が取得できるようにするにはどのような方法が考えられるでしょうか?
###やってみたこと(追加)
一応表現はできましたが、力技な気もします、、、
PHP
1$time = '7500'; 2// とりあえず6桁にそろえます 3$time = sprintf('%06d', $time); // 007500 4 5// 次に2桁ずつ分解します 6$T[] = str_split($time, 2); // $T[0][0] = 00, $T[0][1] = 75, $T[0][2] = 00 7 8// $T[0][1]の値によってデータをいじります 9if($T[0][1] >= 60) { 10 $T[0][0]++; 11 $T[0][1] = sprintf('%02d', $T[0][1] - 60); 12 $time = sprintf('%06d', $T[0][0].$T[0][1].$T[0][2]); 13} 14 15// 数字を時刻へ 16$time = date('H:i:s', strtotime($time));
回答2件
あなたの回答
tips
プレビュー