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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1952閲覧

MySQL PHP 時刻計算 足し算

Z-TALBO

総合スコア525

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/19 09:37

編集2017/05/19 10:28

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

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));

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/19 10:10

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

2017/05/19 10:23

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

回答2

0

ベストアンサー

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

sql

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

投稿2017/05/19 14:48

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2017/05/19 23:26

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

0

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

MySQLのtime型の合計 - Qiita

投稿2017/05/19 10:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Z-TALBO

2017/05/19 23:26

回答ありがとうございます。 大変参考になる事例を提示していただき感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問