MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】VARCHAR型・TIME型の時刻データを合計する方法

MySQLでは、TIME型やVARCHAR型として保存された時刻データを、そのままSUM()関数で合計することができません。そんなときに便利なのが、TIME_TO_SEC()関数とSEC_TO_TIME()関数を組み合わせる方法です。時刻を一度秒数に変換して合計し、その結果を再び時刻形式に戻すことで、正確な合計時間を求められます。

テーブルを作成する

まず、TIME型のカラムを持つテーブルを作成しましょう。

mysql> create table DemoTable1442
    -> (
    -> DueTime time
    -> );
Query OK, 0 rows affected (0.56 sec)

レコードを挿入する

続いて、INSERT文を使ってテーブルに複数のレコードを追加します。

mysql> insert into DemoTable1442 values('00:08:00');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1442 values('00:04:00');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1442 values('12:55:00');
Query OK, 1 row affected (0.15 sec)

レコードを確認する

SELECT文で、テーブル内のすべてのレコードを表示してみます。

mysql> select * from DemoTable1442;

実行すると、次のような出力が得られます。

+----------+
| DueTime  |
+----------+
| 00:08:00 |
| 00:04:00 |
| 12:55:00 |
+----------+
3 rows in set (0.00 sec)

時刻データを合計するクエリ

MySQLでVARCHAR型またはTIME型の時刻データを合計するには、次のクエリを使用します。

mysql> select sec_to_time(sum(time_to_sec(DueTime) ) ) as TotalTime from DemoTable1442;

実行結果は以下のとおりです。

+-----------+
| TotalTime |
+-----------+
| 13:07:00  |
+-----------+
1 row in set (0.03 sec)

クエリの仕組み

このクエリが機能する仕組みは、次の3ステップです。

1. TIME_TO_SEC():各時刻値を経過秒数に変換します(例:「00:08:00」→ 480秒)。
2. SUM():変換されたすべての秒数を合計します。
3. SEC_TO_TIME():合計された秒数を「HH:MM:SS」形式の時刻値に戻します。

なお、VARCHAR型で保存された時刻文字列(例:'00:08:00')の場合も、MySQLが自動的に時刻として解釈するため、同じクエリで問題なく合計を求められます。作業時間の集計や稼働時間の管理など、時間データを扱う場面でぜひ活用してください。

  1. MySQLで現在の日付・時刻を挿入する方法を解説

    MySQLで現在の日付や時刻をテーブルに挿入したい場合、NOW()関数を使用するのが最も簡単な方法です。この記事では、実際の例を通して具体的な手順をわかりやすく解説します。1. テーブルを作成するまず、日付・時刻を格納するためのテーブルを作成します。テーブルの作成にはCREATE TABLEコマンドを使用します。mysql> create table CurrentDateTime -> ( -> CurrentTime datetime -> ); Query OK, 0 rows affected (1.14 sec)ここでは「CurrentDateTime」という

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected