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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

920閲覧

DBの時間合計をphpで表示させると、表示が9時間プラスされてしまう

kens_Freelance

総合スコア10

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/05/26 02:29

編集2021/05/26 04:24

いつもありがとうございます。
ご教授お願いいたします。
勉強中ですので、質問内容がわかりにくいところがあれば
すみませんがご指摘いただけると幸いです。


【質問内容】
下記のようなテーブルから、時間の合計(work_timeの合計)を表示させたいです。
※下記の例であれば「00:00:30」と表示させたい。

<work_timesテーブル>
※カラムの( )はデータ型です

id(int)work_time_date(date)work_time(time)
12021-05-2600:00:10
22021-05-2600:00:05
32021-05-2600:00:15
<?php $work_times = $db->query('SELECT SUM(work_time) FROM work_times WHERE work_time_date = CURRENT_DATE'); $work_time = $work_times->fetch(); var_dump($work_time); echo date('h:i:s', $work_time['SUM(work_time)']); ?>

しかし、実際にブラウザには
09:00:30
となぜか9時間後の表示となってしまいます。

php.iniのタイムゾーンも
mySQLのタイムゾーンも
日本時間になっております。

ちなみに、
上記コードのvar_dump($work_time);の出力結果は
array(2) { ["SUM(work_time)"]=> string(2) "30" [0]=> string(2) "30" }
となっています。

また、phpmyadminで実行した結果は以下です。

SELECT SUM(work_time) FROM work_times WHERE work_time_date = CURRENT_DATE;

sum(work_time) 30

SELECT SUM(work_time) FROM work_times WHERE id = 1;

sum(work_time) 10


何かそもそも根本的な部分が間違っているような気もするのですが
もしお気づきの点があれば教えていただけると幸いです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/26 02:34

テーブル上のデータ型を正確に示してください。CREATE TABLE文で示すとなお良いです。
yambejp

2021/05/26 02:34

var_dump($work_time); の出力結果はどうなっていますか?
FKM

2021/05/26 03:17 編集

SELECT SUM(work_time) FROM work_times WHERE work_time_date = CURRENT_DATE'); だけをphpmyadminなどで実行してみてください。あるいは SELECT SUM(work_time) FROM work_times WHERE id = 1; で実行してみてください。 根本的な間違いをしている可能性があります。
kens_Freelance

2021/05/26 04:24

ありがとうございます。追加・修正しましたのでお手数ですがご確認のほどよろしくお願いします。
guest

回答2

0

ベストアンサー

MySQLのtime型の合計 - Qiita
time型を秒に変換してからSUM取らないとダメよ、とのこと。

まぁ、ややこしくなるので、時間の積算目的であれば、
work_timeをtime型ではなく、
単位を秒と捉えてint型系の欲しい精度の型を使うようにしたらいいと思った。
11.2.1 整数型 (真数値) - INTEGER、INT、SMALLINT、TINYINT、MEDIUMINT、BIGINT

投稿2021/05/26 04:30

編集2021/05/26 05:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kens_Freelance

2021/05/26 08:16

ありがとうございます!m6uさんのおかげでやっと解決できました! 念のために解決できたコードを記載いたします。 <?php $work_time_sums = $db->query( 'SELECT SUM(time_to_sec(work_time)) AS total_sec, sec_to_time(sum(time_to_sec(work_time))) as total FROM work_times WHERE work_time_date = CURRENT_DATE'); $work_time_sum = $work_time_sums->fetch(); echo $work_time_sum['total'] . '<br><br>'; ?>
guest

0

おそらくタイムゾーン設定が問題なのではないでしょうか?
date関数はセットされたタイムゾーンに基づいて出力します。

https://www.php.net/manual/ja/function.date.php
上記マニュアルの

php

1<?php 2// 使用するデフォルトのタイムゾーンを指定します。 3date_default_timezone_set('UTC'); 4 5 6// 結果は、たとえば Monday のようになります。 7echo date("l"); 8 9// 結果は、たとえば Monday 8th of August 2005 03:12:46 PM のようになります。 10echo date('l jS \of F Y h:i:s A'); 11 12// 結果は July 1, 2000 is on a Saturday となります。 13echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000)); 14 15/* 書式指定パラメータに、定数を使用します。 */ 16// 結果は、たとえば Wed, 25 Sep 2013 15:28:57 -0700 のようになります。 17echo date(DATE_RFC2822); 18 19// 結果は、たとえば 2000-07-01T00:00:00+00:00 のようになります。 20echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000)); 21?>

あたりを確認しながらタイムゾーンをいじってみると、なんとなくお分かりになってくるかと思います。

投稿2021/05/26 04:29

torisashi

総合スコア2

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

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

kens_Freelance

2021/05/26 08:17

ご回答ありがとうございます。 タイムゾーンの設定も奥が深いですね。 おかげで理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問