概要
本記事では、Tableauで経過時間(2つの日時間における差分)を可視化する際、文字列型に変換することなくmm:ssやhh:mm:ss形式で表示する方法を記載します。DATENAME関数やSTR関数で時・分・秒をコロンで繋いで無理やり文字列を作るのからは卒業しましょう、、、!
ざっくりアプローチ
- 計算段階: 「分は×100」「時は×10000」して桁をずらす(例: 225秒 → 数値の345に変換する)
- 表示段階: カスタム書式設定
#0:00を適用し、数値の間にコロンを視覚的に挿入する(例: 345 → 3:45)
補足:0埋めについて
カスタム書式 #0:00 は最左桁が0埋めされないため、厳密には「m:ss」形式となります(例:3分45秒 → 3:45)。先頭を0埋めして 03:45 のように表示したい場合は、カスタム書式を 00:00 に変更すればいけます。詳細は後述。
サンプルデータの準備
日時情報のFrom-Toがあれば何でもよいので、以下の形式で簡単に作りました。CSV形式で保存します。
| ユーザーID | 処理開始日時 | 処理終了日時 |
|---|---|---|
| 001 | 2025-12-01 07:00:00 | 2025-12-01 07:00:05 |
| 002 | 2025-12-01 08:00:00 | 2025-12-01 08:00:45 |
| 003 | 2025-12-01 09:00:00 | 2025-12-01 09:03:45 |
| 004 | 2025-12-01 10:00:00 | 2025-12-01 10:23:45 |
| 005 | 2025-12-01 11:00:00 | 2025-12-01 12:23:45 |
Tableau Desktopへの取込
データソースからテキストファイルを選択し、用意したCSVファイルを読み込みます。データ型は以下の通りです。
- ユーザーID:文字列
- 処理開始日時:日時
- 処理終了日時:日時
計算フィールド「所要時間」の作成
元データの処理開始日時と処理終了日時の差分から、秒単位で所要時間を計算するフィールドを作ります。
所要時間(秒)
DATEDIFF('second', [処理開始日時], [処理終了日時])
まずは簡単に秒のままテキスト表にする
図のようにディメンションとメジャーを配置して、簡単なテキスト表を作ってみましょう。

日時の列がメジャーとして配置されてしまった場合は、行に置いた日時列を右クリック→正確な日付にチェック→連続ではなく不連続値にする をやると、元値の形式で表示されます。
mm:ss表記にする
秒単位で計算されている「所要時間」を、mm:ss(分:秒)形式の数値に変換します(hh:mm:ss 表記については後述します)
mmssを表現する計算フィールドを作る
まずは以下の計算フィールドを作りましょう。
所要時間_mm:ss表記
// mm部分:60秒で割った商
// 余りは秒として後続の部分で使うので、ここでは捨てる
// mm:ss表記にした際にコロンの左側へ持ってくるために、×100する
INT([所要時間(秒)] / 60) * 100
+
// ss部分:60秒で割った余り
[所要時間(秒)] % 60
作成後、いま作成した 所要時間_mm:ss表記 をテキスト(マーク)として配置します。先ほど配置した 所要時間(秒) は行シェルフへ移動させて不連続値にし、計算結果(最右列)との比較用に置いてあります。

1分未満であれば元の 所要時間(秒) と同じ値ですが、1分を超える秒数の場合、数値が大きく変化していますね。これが 「mm:ss 形式として読み取れる数値」 への変換結果です。この時点では、まだコロンはありません。
- 例(ユーザーID: 003):
- 元の値:225 (秒)
- 変換後:345
- 読み方:3 (分) 45 (秒)
書式設定でコロンを差し込む
テキストに配置した合計(所要時間_mmss)を右クリックして、書式設定を選択。左サイドバーの既定から数値を選びます。いくつか候補が出るのでカスタムを選んで、入力ボックスに#0:00を入力します。すると、先ほどまで整数で表示されていた所要時間がmm:ss表記に変わっていることがわかります。

上記では3分45秒であれば3:45と表示されますが、カスタム書式を00:00とすれば03:45形式、つまり0埋め表示となりますので、お好みに合わせて調整してください。
hh:mm:ss表記したい場合
mm:ss表記の場合と同様の手順で実現しますが、計算フィールドとカスタム書式設定に差異があります。
所要時間_hh:mm:ss表記
// hh部分は3600秒で割った商 あとはmm:ssと同様
INT([所要時間(秒)] / 3600) * 10000
+
INT([所要時間(秒)] % 3600 / 60) * 100
+
[所要時間(秒)] % 60
カスタム書式設定は#0:00:00を入力します。以下、mm:ssとhh:mm:ss表記を並べてみました。

ここまでのまとめ
秒単位の所要時間を、文字列関数で加工することなく、数値計算とカスタム書式の組み合わせだけでmm:ssやhh:mm:ss表記にできました。
ひとつ補足として、この方法はカスタム書式設定に依存しているため、「mm:ss」と「hh:mm:ss」の動的な混在(値によってコロンの有無を出し分けること。。たとえば「1時間未満なら 3:45、1時間以上なら 1:23:45」のような出し分け)は難しいようです。もし良い回避策をご存知の方がいらっしゃれば、ご教示ください。
次項からは応用編として、所要時間の平均集計を挟んでからmm:ss表記する方法を記載します。
集計値を mm:ss 表記にする
前項までの手順で、各レコードの所要時間を mm:ss 表記にできました。本項では、複数レコードの所要時間を「集計してから」表示するケースを扱います。たとえば、以下のように最小値・最大値・平均値を一覧表示する場合です。

集計の種類による対応の違い
前項の手順で、個々のレコード(行)に対して mm:ss 表記を行うことができました。 けれども、複数のレコードを集約して平均値や合計値を算出したい場合、単純に前項の計算フィールドを使ってはいけません。
| 集計種別 | mm:ss変換後のフィールドをそのまま使えるか |
|---|---|
| 最小値・最大値 | OK!そのまま使用可能 |
| 合計・平均 | NG!先に秒単位で集計してからmm:ss変換が必要 |
単に最小値と最大値を出すだけであれば、mmss向けに計算したフィールドをそのまま使ってOKです。変換後の数値(例: 345, 400, ...)は、元の秒数の大小関係(順序)と完全に一致しているため、変換済みの 所要時間_mm:ss表記 をそのまま利用しても正しい結果が得られます。
なぜ合計・平均では問題が起きるのか?
mm:ss変換の計算式は、分の桁を100倍にシフトしています。たとえば、、
-
例: 3分45秒(225秒) $\rightarrow$ 数値の
345に変換 -
例: 3分20秒(200秒) $\rightarrow$ 数値の
320に変換
この2つの平均をとると、(345 + 320) / 2 = 332.5となります。これをmm:ssとして読むと「3分32.5秒」に見えますが、実際の秒数の平均は(225 + 200) / 2 = 212.5秒(3分32.5秒)なので、mm:ss変換後の値を平均してしまうと実際の値より大きい計算結果になってしまうんです。
正しい結果を得るには、秒単位のまま合計や平均を算出し、その後で mm:ss 変換を行う必要があります。以下、平均値を例にとり手順を記載します。
平均値 所要時間(秒)
AVG([所要時間(秒)])
平均値 所要時間_mm:ss表記
INT([平均値 所要時間(秒)] / 60) * 100
+
[平均値 所要時間(秒)] % 60
あとは、以下の手順を踏んだら、複数パターンの集計値を縦に並べて配置した表が完成します。
- メジャーネームを「行」に配置
- メジャーバリューを「テキスト」に配置
- 不要なメジャーをメジャーバリューから除外
- 最大値・最小値は
所要時間_mm:ss表記をそのまま使用し、集計方法を「最大値」「最小値」に変更 - 平均値は上記で作成した
平均値 所要時間_mm:ss表記を使用 - カスタム書式
#0:00をメジャーバリューに適用(個別に設定しなくても、メジャーバリューの書式さえ変更すれば、すべてのメジャーバリューに適用)
今回の手順はここまでです。文字列でmm:ssを作っていた頃は、上手くテキスト表にできなかったり、表現に制約があったりしてツラかったんですよね、、、数値のまま表現するこの方法に切り替えてからは、書式設定だけで柔軟に対応できるようになり、だいぶ楽になりました!