Power QueryのDurationをExcel日付と比較して理解する

LWP | Power QueryのDurationをExcel日付と比較して理解する

LWP TECHNICAL ARTICLE | 184

Power QueryのDurationをExcel日付と比較して理解する

「日付-日付」の答えが数値の1ではなく、時間の長さになる理由

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

Excelで日付どうしを引くと、日数を表す数値が返ります。Power QueryのM言語で同じようにdateどうしを引くと、返るのはnumberではなくdurationです。1 と「1日」は意味が違うため、Power Queryは数値と時間の長さを別の型として扱います。

Durationは、時間軸上の二つの時点の距離です。#duration(日, 時, 分, 秒) で作成でき、正負の値を持ちます。Duration.Days は日という構成部分を取り出し、Duration.TotalDays は時間・分・秒まで含む全体を日単位のnumberへ変換します。

この記事では、Excelの日付シリアル値との対応を橋にして、date、datetime、durationの関係を整理します。さらに、「30日後」と「1か月後」を分け、固定された時間の長さと暦上の移動を混同しない判断軸を作ります。

本記事の対象とゴール

想定読者

  • Excelの日付差には慣れているが、Power QueryのDurationで戸惑った方

  • Duration.Days と Duration.TotalDays の違いを実務で使い分けたい方

  • 日数、経過時間、月後・年後の計算を型の意味から整理したい方

本記事で得られること

  1. なぜdateどうしの引き算がnumberではなくdurationを返すのか説明できます。

  2. Durationの構成部分取得と、全体の単位換算を使い分けられます。

  3. 固定期間と暦計算を区別し、目的に合う関数を選べます。

はじめに Excelでは1、Power Queryでは1日

Excelで次の二つの日付を引きます。

2026/8/21 - 2026/8/20

結果は数値の1です。Excelは日付をシリアル値として扱うため、1日の差がnumberの1として現れます。

Power QueryのM言語では、同じ日付差を次のように書けます。

#date(2026, 8, 21) - #date(2026, 8, 20)

結果はnumberの1ではなく、1日分のdurationです。

#duration(1, 0, 0, 0)

最初に押さえる違いは、これだけです。

1   → 数値
1日 → 時間の長さ

Power Queryでは、この二つを別の値の種類として扱います。

第1章 Durationは時間軸上の距離

1.1 「いつ」ではなく「どれだけ」

Durationは、二つの時点の間にある時間の長さを表します。

#duration(2, 5, 30, 0)

これは次の長さです。

2日
5時間
30分
0秒

#duration の引数は、日、時、分、秒の順です。

#duration(days, hours, minutes, seconds)

1.2 時点を表す型と長さを表す型

Power Queryの日付・時刻関係の値を、意味で分けます。

型 表すもの 例
date ある日 2026年8月21日
time ある時刻 15時30分
datetime ある日時 2026年8月21日15時30分
datetimezone タイムゾーンを含む日時 UTC+9の日時
duration 時間の長さ 2日5時間30分

date、time、datetime、datetimezoneは「いつか」を表します。durationは「どれだけ離れているか」を表します。

1.3 差がDurationになるのは自然な型設計

時点A - 時点B
↓
二つの時点の距離
↓
Duration

日付差を単なる数値ではなく、時間の長さとして受け取ることで、その後に「日数として使う」「時間として使う」と目的を選べます。

第2章 Excelでは日付と時間差の基礎にNumberがある

2.1 1日を1として扱う

Excelでは、日付や時刻の基礎にシリアル値があります。

1    = 1日
0.5  = 12時間
0.25 = 6時間

そのため、日付に1を加えると翌日になり、日付どうしを引くと日数を表すnumberになります。

2.2 Power Queryでは意味ごとに型を分ける

Power Queryでは、number、date、time、datetime、durationを区別します。

1                         → number
#date(2026, 8, 21)        → date
#duration(1, 0, 0, 0)     → duration

Durationは、numberへ時間らしい表示形式を付けただけのものではありません。正式な値の種類です。

第3章 Excelのシリアル値との橋は残っている

3.1 Date.Fromでnumberからdateへ変換する

Power Queryは型を分けていますが、数値と日付の変換手段を持ちます。

Date.From(43910)

結果は次の日付です。

#date(2020, 3, 20)

Microsoftの Date.From 仕様では、numberを変換する場合、1899年12月30日午前0時を基準にします。整数部分はその基準から前後する日数、小数部分は1日に対する時刻の割合です。

3.2 「同じ内部表現」とは言わない

ここで、Power Queryのdate型そのものを「Excelのシリアル値」と説明するのは正確ではありません。Power Queryではdateは独立した型です。

正確には、次のように説明します。

> Power Queryでは日付が独立した型である一方、Excel利用者に馴染みのある日数・時刻の数値体系から変換できる。

Excelの1900日付システムには歴史的な互換性事情があります。通常の現代日付では馴染みのある対応を利用できますが、両者の内部仕様が完全に同じだとは決めつけません。

第4章 Duration全体を日数へ変換する

4.1 Duration.TotalDays

次のdurationは、1日12時間です。

#duration(1, 12, 0, 0)

これをExcel的な日数へ変換するには、Duration.TotalDays を使います。

Duration.TotalDays(
    #duration(1, 12, 0, 0)
)

結果はnumberの1.5です。

1日12時間
↓
Duration.TotalDays
↓
1.5日

4.2 時間・分・秒へも換算できる

同じdurationを別の単位へ換算できます。

関数 #duration(1,12,0,0) の結果
Duration.TotalDays 1.5
Duration.TotalHours 36
Duration.TotalMinutes 2160
Duration.TotalSeconds 129600

Total 系関数は、duration全体を指定単位のnumberへ変換します。

第5章 Duration.DaysとDuration.TotalDaysを分ける

5.1 Daysは日という構成部分

次のdurationを使います。

#duration(5, 4, 3, 2)

これは5日4時間3分2秒です。

Duration.Days(
    #duration(5, 4, 3, 2)
)

結果は5です。4時間3分2秒を小数の日へ換算しません。

同様に、次の関数は各構成部分を取り出します。

Duration.Days     → 5
Duration.Hours    → 4
Duration.Minutes  → 3
Duration.Seconds  → 2

5.2 TotalDaysは全部を日へ換算する

Duration.TotalDays(
    #duration(5, 4, 3, 2)
)

Microsoft公式例の結果は、次のnumberです。

5.1687731481481478

違いを一行でまとめます。

Duration.Days       = 日という構成部分
Duration.TotalDays  = duration全体を日単位へ換算した値

5.3 経過日数にはTotalDaysを検討する

開始日時が2026年8月20日12時、終了日時が2026年8月22日0時なら、経過は1日12時間です。

Duration.Days       → 1
Duration.TotalDays  → 1.5

「何日と何時間のうち、日部分だけ」を使うのか、「全経過時間を日数で表す」のかを先に決めます。

第6章 numberからDurationを作る

Excel的な日数1.5からdurationを作るには、Duration.From を使えます。

Duration.From(1.5)

結果は1日12時間に相当するdurationです。

number 1.5
↓
Duration.From
↓
#duration(1, 12, 0, 0)

変換の両方向を並べると理解しやすくなります。

number ──Duration.From────→ duration
number ←─Duration.TotalDays─ duration

第7章 異なる日時型を引く前に型をそろえる

MicrosoftのDuration解説では、dateとdatetimeなど、異なる日付・時刻型をそのまま引くとエラーになると説明されています。

#datetime(2026, 8, 21, 12, 0, 0)
- #date(2026, 8, 20)

型が違う場合は、目的に応じて明示的にそろえます。

#datetime(2026, 8, 21, 12, 0, 0)
- DateTime.From(#date(2026, 8, 20))

型変換を明示すると、「日だけを比較するのか」「時刻まで含めるのか」がコードに残ります。

第8章 固定された長さと暦上の移動を分ける

8.1 1か月は固定されたDurationではない

1日、1時間、30分は固定された長さです。一方、1か月の日数は月によって変わります。

1月 → 31日
2月 → 28日または29日
4月 → 30日

MicrosoftのDuration解説でも、durationは日、時、分、秒という固定単位を基にし、月や年のように長さが変わる暦単位を直接表す型ではないと説明されています。

8.2 「30日後」と「1か月後」は違う

2026年1月31日から考えると、30日後と1か月後は同じ意味ではありません。

固定された30日を加える → Durationの考え方
暦上で1か月進める      → Date.AddMonthsの考え方

同様に、365日後と1年後も常に同じではありません。

8.3 判断軸

経過時間・待ち時間・処理時間・滞在時間
→ Duration
 
翌月・1か月後・1年後・月末
→ Date.AddMonths / Date.AddYearsなどの暦関数

Durationは暦そのものではなく、時間軸上の距離です。

第9章 Durationは正にも負にもなる

引き算の順序を逆にすると、durationは負になります。

#date(2026, 8, 20) - #date(2026, 8, 21)

結果は1日分の負のdurationです。

後の時点 - 前の時点 → 正のDuration
前の時点 - 後の時点 → 負のDuration

この性質は、期限超過、予定日前後、前回処理からの経過などを判定するときに使えます。

第10章 実務で使う最小パターン

10.1 経過日数を小数で得る

let
    StartAt = #datetime(2026, 8, 20, 12, 0, 0),
    EndAt = #datetime(2026, 8, 22, 0, 0, 0),
    Elapsed = EndAt - StartAt,
    ElapsedDays = Duration.TotalDays(Elapsed)
in
    ElapsedDays

結果は1.5です。

10.2 日・時・分・秒の各部分を表示する

let
    Elapsed = #duration(5, 4, 3, 2),
    Parts = [
        Days = Duration.Days(Elapsed),
        Hours = Duration.Hours(Elapsed),
        Minutes = Duration.Minutes(Elapsed),
        Seconds = Duration.Seconds(Elapsed)
    ]
in
    Parts

結果は、日5、時4、分3、秒2のrecordです。

10.3 数値日数をDurationへ変換する

let
    DaysAsNumber = 1.5,
    Span = Duration.From(DaysAsNumber)
in
    Span

結果は1日12時間に相当するdurationです。

まとめ Durationは「日付差」ではなく時間の長さそのもの

  • Excelでは日付差がnumberとして現れます。

  • Power Queryでは、dateやdatetimeの差がdurationになります。

  • Durationは、二つの時点の間にある時間軸上の距離です。

  • Duration.Days は日部分、Duration.TotalDays は全体の日単位換算です。

  • Duration.From で日数を表すnumberからdurationを作れます。

  • 異なる日付・時刻型を引く前には、目的に合わせて型をそろえます。

  • 固定された時間の長さにはDuration、1か月後や1年後には暦関数を使います。

Excelではnumberの中に隠れていた「時間の長さ」を、Power Queryではdurationとして明示的に扱います。

Excel
終了日時 - 開始日時
→ 1.5というnumber
 
Power Query
終了日時 - 開始日時
→ 1日12時間というduration
→ Duration.TotalDays
→ 1.5というnumber

Power QueryのDurationは、特殊な日付表示でも、扱いにくい数値でもありません。時間の長さそのものを表すための型です。

参考資料

  • Microsoft Learn「Duration support in Power Query M」

  • Microsoft Learn「M Language values」

  • Microsoft Learn「Duration.TotalDays」

  • Microsoft Learn「Date.From」

出典メモ

  • 元原稿: C:\Users\hoehoe\Downloads\記事ネタmd\Power QueryのDurationとは何か――Excelの日付との違いから理解する【記事元ネタ】.md

  • 元原稿のExcelとの対比、DaysとTotalDays、固定期間と暦の区別を主軸に、再現用コードを加えて公開記事へ再編集しました。

  • Durationの定義、正負、100ナノ秒tick、構成部分、Total系関数、異なる日時型の演算、月・年との区別は、2026年8月21日にMicrosoft公式仕様で確認しました。

  • 公式資料: https://learn.microsoft.com/en-us/powerquery-m/durations

  • 公式資料: https://learn.microsoft.com/en-us/powerquery-m/m-spec-values

  • 公式資料: https://learn.microsoft.com/en-us/powerquery-m/duration-totaldays

  • 公式資料: https://learn.microsoft.com/en-us/powerquery-m/date-from