MySQLのDATE_FORMATとTIME_TO_SEC:日時の表示と時間の数値化
作成日:2026.10.13
MySQLのDATE_FORMATで日時の表示を整える方法と、TIME_TO_SECで時間を秒数へ変換する方法を解説します。入力と結果を比較しながら、月と分の書式指定、NULL、負の時間、24時間を超える時間の扱いも紹介します。
目次
SELECTで日時や時間を取得するとき、「日時を読みやすく表示したい」「所要時間を秒数にして計算したい」といったことがあります。
日時の表示を整えるならDATE_FORMAT、時間を秒数へ変換するならTIME_TO_SECを使えます。今回は、それぞれの基本と、書式指定やNULL、24時間を超える時間の扱いを説明します。SELECTの基本が分かる人向けの内容です。
対象はMySQL 8.4です。仕様は2026年10月13日時点の公式資料で確認しています。
DATE_FORMATで日時の表示を整える
DATE_FORMATは、日時と書式を指定すると、その書式の文字列を返します。基本的な形は次のとおりです。
DATE_FORMAT(日時, 書式)
書式には、年を表す%Y、月を表す%mなどを組み合わせて書きます。よく使う指定は次のとおりです。
| 指定 | 意味 | 例 |
|---|---|---|
%Y | 4桁の年 | 2026 |
%m | 2桁の月 | 10 |
%d | 2桁の日 | 13 |
%H | 24時間表記の時 | 09 |
%i | 2桁の分 | 05 |
%s | 2桁の秒 | 07 |
例えば、次のSELECTでは、元の日時と二つの表示形式を並べています。
SELECT
'2026-10-13 09:05:07' AS original_datetime,
DATE_FORMAT('2026-10-13 09:05:07', '%Y/%m/%d') AS date_label,
DATE_FORMAT('2026-10-13 09:05:07', '%Y-%m-%d %H:%i:%s') AS datetime_label;
| original_datetime | date_label | datetime_label |
|---|---|---|
| 2026-10-13 09:05:07 | 2026/10/13 | 2026-10-13 09:05:07 |
SQLの例では、日時を文字列で直接指定しています。テーブルの列に適用する場合は、DATE_FORMAT(created_at, '%Y/%m/%d')のように、最初の引数を列名へ置き換えます。
スラッシュやハイフン、コロンは、そのまま結果に含まれます。ここで変わるのはSELECTの出力で、保存済みの日時が書き換わるわけではありません。また、DATE_FORMATの結果は日付型ではなく文字列なので、表示用の列として使い、日時の比較や計算には元の日時を使うと分かりやすいです。
月は%m、分は%i
書式で間違えやすいのが、月と分の指定です。分には%iを使います。先ほどの日時で'%H:%m:%s'と書くと、期待結果は09:10:07となり、分の位置に10月の「10」が入ってしまいます。
時分秒を表示するなら'%H:%i:%s'と覚えておくとよいかと思います。書式の一覧は、MySQL公式のDATE_FORMATの説明を参照してください。
日時か書式がNULLなら、結果もNULL
DATE_FORMATは、日時または書式がNULLの場合、NULLを返します。
SELECT
DATE_FORMAT(NULL, '%Y/%m/%d') AS null_datetime,
DATE_FORMAT('2026-10-13 09:05:07', NULL) AS null_format;
| null_datetime | null_format |
|---|---|
NULL | NULL |
画面で「未設定」などと表示したい場合は、NULLの扱いを別途決めます。条件に応じた表示名を作る方法は、MySQLのCASE式入門の記事でも説明しています。
TIME_TO_SECで時間を秒数にする
TIME_TO_SECは、時間を秒数へ変換する関数です。
TIME_TO_SEC(時間)
例えば、説明用の所要時間が1時間30分なら、次のように秒数や分数へ変換できます。
SELECT
'01:30:00' AS original_duration,
TIME_TO_SEC('01:30:00') AS duration_seconds,
TIME_TO_SEC('01:30:00') / 60 AS duration_minutes;
| original_duration | duration_seconds | duration_minutes |
|---|---|---|
| 01:30:00 | 5400 | 90 |
1時間は3600秒、30分は1800秒なので、合計5400秒です。さらに60で割ると90分になります。表は数値としての期待結果を示しており、小数点以下の表示桁数はクライアントなどによって異なる場合があります。
所要時間を保存した列がdurationなら、TIME_TO_SEC(duration)のように書けます。秒数にしておけば、秒単位のしきい値と比較したり、合計や平均を求めたりする際に扱いやすくなります。構文と戻り値は、MySQL公式のTIME_TO_SECの説明で確認できます。
時刻と所要時間は、データの意味を分けて考える
MySQLのTIME型は、「午前1時30分」のような時刻にも、「1時間30分」のような経過時間にも使えます。TIME_TO_SECは、そのデータがどちらの意味なのかを判断してくれるわけではありません。
時刻としての01:30:00を渡しても結果は5400ですが、それだけで作業の所要時間を求めたことにはなりません。開始日時と終了日時から秒単位の差を求めたい場合は、TIMESTAMPDIFF(SECOND, 開始日時, 終了日時)など、日時同士の差を求める処理を使います。TIME_TO_SECは、日時をUNIXタイムスタンプへ変換する関数でもありません。
NULL・負の時間・24時間を超える時間を確認する
TIME_TO_SECは、NULLを渡すとNULLを返します。また、MySQLのTIME型は負の時間や24時間を超える時間も表せるので、所要時間を扱うときは、そのような値も確認しておきます。
次の例では、WITH句で比較用の5行を用意しています。テーブルの作成や保存済みデータの変更は不要です。WITH句の基本は、MySQLのWITH句入門の記事を参照してください。
WITH sample_durations AS (
SELECT 1 AS id, '00:00:00' AS duration
UNION ALL SELECT 2, '00:00:30'
UNION ALL SELECT 3, '-00:30:00'
UNION ALL SELECT 4, '25:00:00'
UNION ALL SELECT 5, NULL
)
SELECT
id,
duration,
TIME_TO_SEC(duration) AS duration_seconds
FROM sample_durations
ORDER BY id;
| id | duration | duration_seconds |
|---|---|---|
| 1 | 00:00:00 | 0 |
| 2 | 00:00:30 | 30 |
| 3 | -00:30:00 | -1800 |
| 4 | 25:00:00 | 90000 |
| 5 | NULL | NULL |
25時間は90000秒になり、24時間を超えた分も含まれます。NULLは0秒と区別されますし、負の値を自動的に0へ補正することもありません。所要時間として負の値を許容するかどうかは、データの用途に合わせて判断しましょう。
なお、TIME型には範囲があり、整数秒では-838:59:59から838:59:59までです。任意の長さの経過時間を格納できるわけではありません。省略した時間表記や、範囲外・不正な値の扱いにも注意が必要なので、例ではhh:mm:ssの形にそろえています。詳しくは、MySQL公式のTIME型の説明を確認してください。
DATE_FORMATは表示用の文字列、TIME_TO_SECは計算に使う秒数を返します。まずは元の値と加工後の値を並べて、表示したい形式や計算したい単位になっているかを確認してみてください。
奈良市を拠点に、27年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。
これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。
【制作会社・企業様向けサポート】
Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。
ぜひ、プロフィールやWeb制作会社様向け業務案内、一般企業様向け業務案内もご覧くださいね。
MySQLのCASE式入門:条件に応じてSELECTの出力を切り替える
2026.10.12
MySQLのCASE式を使い、条件に応じてSELECTの出力値を切り替える方法を解説します。状態コードを表示名に変換する例を通して、基本構文、ELSEとNULLの扱い、条件が重なる場合のWHENの順序を紹介します。
MySQLで文字列を整形・抽出する:TRIM・SUBSTRING_INDEX・REGEXP_SUBSTRの使い方
2026.10.11
MySQLで取得する文字列から不要な空白を除いたり、区切り文字や正規表現を使って必要な部分を取り出したりする方法を紹介します。TRIM・SUBSTRING_INDEX・REGEXP_SUBSTRの基本構文と使い分けを、具体的なSQL例で解説。NULLや空文字、想定した形式に合わない値を扱う際の注意点も整理します。
phpMyAdminユーザー向けMySQL Workbench入門:テーブル確認からSQL実行まで
2026.10.10
phpMyAdminに慣れた人向けに、MySQL Workbenchの基本操作を解説します。両ツールの動作場所と接続経路の違いから、接続設定、テーブル・カラムの構造確認、SQLの実行、結果とエラーの見方までを紹介。SELECTを試す前にEXPLAINで実行計画を確認する手順も扱います。
MySQLのWITH句入門:SELECTの結果を加工・集計する方法
2026.10.09
MySQLのWITH句を使って、SELECTの取得結果を加工・集計する方法を解説します。注文データを例に、CTE(共通テーブル式)の基本と複数CTEの書き方、サブクエリとの違い、利用時の注意点を紹介します。