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

【MySQL】TIMEDIFFの出力結果を「日・時・分・秒」形式に変換する方法

TIMEDIFFの結果を「日・時・分・秒」形式に変換するには

MySQLでTIMEDIFF関数の戻り値を「〇日〇時間〇分〇秒」という読みやすい形式に変換するには、CONCAT()関数を使います。あわせてFLOOR()やMOD()などの関数を組み合わせることで、24時間を超える差分も「日」と「時間」にきれいに分割できます。

ここからは、実際にサンプルテーブルを作成し、手順を追って動作を確認していきます。

1. サンプルテーブルを作成する

まず、開始日時と終了日時を格納するためのテーブルを作成します。テーブル作成のクエリは以下のとおりです。

mysql> create table convertTimeDifferenceDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> StartDate datetime,
    -> EndDate datetime,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.68 sec)

2. テストデータを挿入する

続いて、INSERTコマンドで複数のレコードを追加します。date_add()を使うと、現在時刻から相対的な日時を簡単に生成できるので便利です。

mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values(date_add(now(),interval -3 hour),date_add(now(),interval 3 hour));
Query OK, 1 row affected (0.41 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values(date_add(now(),interval -2 hour),date_add(now(),interval 2 hour));
Query OK, 1 row affected (0.27 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values('2018-04-05 12:30:35','2018-05-17 14:30:50');
Query OK, 1 row affected (0.14 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values('2017-10-11 11:20:30','2017-12-17 15:21:55');
Query OK, 1 row affected (0.20 sec)

3. 登録データを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from convertTimeDifferenceDemo;

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

+----+---------------------+---------------------+
| Id | StartDate           | EndDate             |
+----+---------------------+---------------------+
|  1 | 2019-01-28 20:55:33 | 2019-01-29 02:55:33 |
|  2 | 2019-01-28 21:57:42 | 2019-01-29 01:57:42 |
|  3 | 2018-04-05 12:30:35 | 2018-05-17 14:30:50 |
|  4 | 2017-10-11 11:20:30 | 2017-12-17 15:21:55 |
+----+---------------------+---------------------+
4 rows in set (0.00 sec)

4. 差分を「日・時・分・秒」形式に変換するクエリ

TIMEDIFF()で取得した差分をHOUR()・MINUTE()・SECOND()でそれぞれ取り出し、FLOOR()とMOD()を使って24時間単位の値を「日」と「時間」に振り分けます。最後にCONCAT()で文字列として連結すれば、人が読みやすい形で出力できます。

mysql> SELECT CONCAT(
    -> FLOOR(HOUR(TIMEDIFF(StartDate,EndDate)) / 24), ' 日 ',
    -> MOD(HOUR(TIMEDIFF(StartDate,EndDate)), 24), ' 時間 ',
    -> MINUTE(TIMEDIFF(StartDate,EndDate)), ' 分 ',
    -> SECOND(TIMEDIFF(StartDate,EndDate)), ' 秒') AS 経過時間
    -> FROM convertTimeDifferenceDemo;

実行結果は以下のようになります。

+--------------------------------+
| 経過時間                       |
+--------------------------------+
| 0 日 6 時間 0 分 0 秒          |
| 0 日 4 時間 0 分 0 秒          |
| 34 日 22 時間 59 分 59 秒      |
| 34 日 22 時間 59 分 59 秒      |
+--------------------------------+
4 rows in set, 6 warnings (0.04 sec)

注意点:TIME型の範囲制限について

TIMEDIFF()が返すTIME型には「-838:59:59」から「838:59:59」までという表現範囲の制限があります。これは「34日22時間59分59秒」に相当するため、差分がこれを超える3行目・4行目のレコードは上限で丸められ、どちらも同じ結果になっています。実行時に「6 warnings」と表示されるのも、この桁あふれによるものです。

より長い期間を正確に計算したい場合は、TIMESTAMPDIFF(unit, 開始日時, 終了日時)を使って日数や秒数を直接求める方法も検討するとよいでしょう。

まとめ

MySQLのTIMEDIFF()の結果を「日・時・分・秒」の形式に整えるには、CONCAT()とFLOOR()、MOD()を組み合わせるのが基本のテクニックです。ただしTIME型には約35日弱という上限があるため、長期間の差分を扱うケースではTIMESTAMPDIFF()の活用をおすすめします。

  1. PHP・MySQLで日付形式をdd/mm/yyyyに変更する方法

    PHPやMySQLでは、日付の表示形式を自由に変更できます。本記事では、日付を「dd/mm/yyyy(日/月/年)」形式に変換する方法を、PHPとMySQLそれぞれのケースについて解説します。PHPで日付形式を変更する方法PHPでは、date()関数を使って日付形式を簡単に変更できます。基本構文は以下の通りです。date(d/m/Y, 日時の変数);また、文字列を日付として扱う場合は、strtotime()関数を使用します。この関数は、日付を表す文字列をUnixタイムスタンプに変換してくれるため、date()関数と組み合わせて使うのが一般的です。以下は、日時を「dd/mm/yyyy」形式に整形

  2. PHP変数「11:00 AM」をMySQLの時間形式に変換する方法

    PHPの「11:00 AM」をMySQLの時間形式に変換する方法 MySQLのTIME型やDATETIME型は、時刻を24時間表記の「HH:MM:SS」形式で管理します。そのため、「11:00 AM」のようにAM/PMを含む文字列をデータベースに保存する場合は、事前に形式を変換しておく必要があります。本記事では、PHP標準のDateTimeクラスを使った変換方法を、サンプルコードと実行結果付きで解説します。 変換の基本の流れ DateTime::createFromFormat() … 入力文字列をDateTimeオブジェクトとして解析する format() … 解析結果を「H:i:s」(2