Tableauで日付の計算はよく使うのに、毎回書き方を忘れがちです。
特に「月初ってどう書いたっけ?」「今月の平日って何日?」といった処理は繰り返し出てきます。
この記事では、実務で頻出する日付関連の計算フィールドを、
すべてベストプラクティスに基づいた形式で、意味と背景付きでまとめました。
目次
基本方針:Tableauの日付関数は常にDATEでキャストする
TableauのDATETRUNC
やDATEADD
などの関数は、デフォルトで「日時型」になります。
日付だけ欲しい場面では、DATE()
で明示的にキャストしましょう。
// 月初を取得(ベストプラクティス)
DATE(DATETRUNC('month', [日付]))
当月に関する計算フィールド
月初と月末
// 月初
DATE(DATETRUNC('month', [日付]))
// 月末
DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付]))))
当月の日数
// 当月最終日の日にち = 当月日数
DAY(DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付])))))
月初から今日までの日数
DATEDIFF('day', DATE(DATETRUNC('month', TODAY())), TODAY()) + 1
月末までの残り日数
DATEDIFF('day', TODAY(), DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', TODAY())))))
月によって日数を変える動的処理(当月・先月・翌月対応)
IF DATETRUNC('month', [日付]) = DATETRUNC('month', TODAY()) THEN
DATEDIFF('day', TODAY(), DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', TODAY())))))
ELSEIF DATETRUNC('month', [日付]) < DATETRUNC('month', TODAY()) THEN
DAY(DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付])))))
ELSE
0
END
曜日や平日の処理
月初の曜日(英語)
DATENAME('weekday', DATE(DATETRUNC('month', [日付])))
月初の平日(初日が土日の場合スキップ)
DATE(
IF DATEPART('weekday', DATE(DATETRUNC('month', [日付]))) = 1 THEN
DATEADD('day', 1, DATE(DATETRUNC('month', [日付])))
ELSEIF DATEPART('weekday', DATE(DATETRUNC('month', [日付]))) = 7 THEN
DATEADD('day', 2, DATE(DATETRUNC('month', [日付])))
ELSE
DATE(DATETRUNC('month', [日付]))
END
)
月末の平日(最終日が土日の場合前倒し)
DATE(
IF DATEPART('weekday', DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付]))))) = 1 THEN
DATEADD('day', -2, DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付])))))
ELSEIF DATEPART('weekday', DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付]))))) = 7 THEN
DATEADD('day', -1, DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付])))))
ELSE
DATE(DATEADD('day', -1, DATEADD('month', 1, DATETRUNC('month', [日付]))))
END
)
当月の平日数(営業日数)
// 初平日〜最終平日までの日数(+1で初日を含む)から土日を除く
DATEDIFF('day', [初平日], [最終平日]) + 1
- 2 * DATEDIFF('week', [初平日], [最終平日])
※祝日除外は別にカレンダーデータをJOINする必要があります。
ゴミ出しロジックに応用できる構文
隔週の火曜日(例:プラごみ)
DATE(DATEADD('day', 3 - DATEPART('weekday', [日付]), [日付]))
第n週のx曜日(例:第4水曜日)
IF DATEPART('weekday', DATE(DATETRUNC('month', [日付]))) <= 4 THEN
DATE(DATEADD('day', 4 - DATEPART('weekday', DATE(DATETRUNC('month', [日付]))) + 21, DATE(DATETRUNC('month', [日付]))))
ELSE
DATE(DATEADD('day', 4 - DATEPART('weekday', DATE(DATETRUNC('month', [日付]))) + 28, DATE(DATETRUNC('month', [日付]))))
END
先月に関する計算フィールド
先月初・先月末・日数
// 先月初
DATE(DATEADD('month', -1, DATETRUNC('month', [日付])))
// 先月末
DATE(DATEADD('day', -1, DATETRUNC('month', [日付])))
// 先月日数
DAY(DATE(DATEADD('day', -1, DATETRUNC('month', [日付]))))
翌月に関する計算フィールド
翌月初・翌月末・日数
// 翌月初
DATE(DATEADD('month', 1, DATETRUNC('month', [日付])))
// 翌月末
DATE(DATEADD('day', -1, DATEADD('month', 2, DATETRUNC('month', [日付]))))
// 翌月日数
DAY(DATE(DATEADD('day', -1, DATEADD('month', 2, DATETRUNC('month', [日付])))))
補足:祝日を除く営業日を求めるには?
Tableauだけでは祝日カレンダーを持っていないため、Googleカレンダーや自社カレンダーをExcel連携やデータベース結合で読み込む必要があります。
- 祝日列(例:「営業日フラグ = 1 or 0」)を持つマスターデータを用意
- それを[日付]とJOIN
IF [営業日フラグ] = 1 THEN 1 ELSE 0 END
で日数カウント
まとめ
日付処理はTableauダッシュボードの根幹です。
※2025年最新版のTableau構文に準拠。公式ドキュメントやTableau Community Forumも参考にしています。
Comment