雑・Excel入門試論 - 脱VLOOKUPの思考 23 DAX - タイムインテリジェンス

# タイムインテリジェンスとは
　タイムインテリジェンス関数は、時間軸を伴う計算を行います。月ごとや年ごとの集計や、前月比、前年比などの計算ができます。

　DAXでのタイムインテリジェンスとは、日付フィルターのフィルターコンテキストを変更する計算です。この計算を行うためには、日付テーブルを作成し、日付テーブルとしてマーク、リレーションの作成が必要です。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/4a324734-a79a-0b94-bdc3-8286e0c315cc.png"/>


※日付テーブルの作成については「<ins>[雑・Excel入門試論 - 脱VLOOKUPの思考 20 パワーピボット - 日付テーブル](https://qiita.com/spumoni/items/340e0fcbc9cd10198112)</ins>」参照

# 期間の計算

|関数名|内容|
|:--|:--|
DATESYTD|年度累計の日付を含む単一テーブル
DATESMTD|月累計の日付を含む単一テーブル
DATESQTD|四半期累計の日付を含む単一テーブル
TOTALYTD|年累計
TOTALMTD|月累計
TOTALQTD|四半期累計
DATESBETWEEN|指定した開始日で始まり、指定した終了日までの日付の列を含むテーブル
DATESINPERIOD|指定した開始日で始まり、指定した終了日まで、指定した間隔の日付の列を含むテーブル

## TOTALYTD

```text:TOTALYTD構文
TOTALYTD(
    <expression>,       // スカラー値を返す式
    <dates>             // 日付を含む列
    [,<filter>]         // 現在のコンテキストに適用するフィルター
    [,<year_end_date>]  // 年度末の日付
)  
```
　6月30日が年度末となる年累計を計算します。

```text:TotalYtd
TotalYtd := TOTALYTD(
	SUM(financials[Sales]),  // スカラー値を返す式
	DateTable[Date],         // 日付を含む列
	ALL(DateTable),          // 現在のコンテキストに適用するフィルター
	"6/30"                   // 年度末の日付
)
```

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/7316f572-c720-d5f3-f050-fe3559f4afbc.png"/>
　TotalYtdは、7月から6月までが累計される計算になっています。

# 期間の比較
　タイムインテリジェンス関数のもう一つのグループは、時間軸をシフトすることに関するものです。

|関数名|内容|
|:--|:--|
DATEADD|指定した間隔だけシフトした日付のテーブル
PARALLELPERIOD|指定した日付列と並行する期間をシフトさせた日付のテーブル
SAMEPERIODLASTYEAR|1年前にシフトした日付のテーブル
NEXTDAY|翌日の日付のテーブル
NEXTMONTH|翌月の日付のテーブル
NEXTQUARTER|翌四半期の日付のテーブル
NEXTYEAR|翌年の日付のテーブル
PREVIOUSDAY|前日の日付のテーブル
PREVIOUSMONTH|前月の日付のテーブル
PREVIOUSQUARTER|前四半期の日付のテーブル
PREVIOUSYEAR|前年の日付のテーブル

## DATEADD と PARALLELPERIOD

```text:DATEADD構文
DATEADD(
    <dates>,                // 日付を含む列
    <number_of_intervals>,  // 日付に対する間隔を指定する整数
    <interval>)             // 日付をシフトする間隔 YEAR, QUARTER, MONTH, DAYのいずれか
```

```text:PARALLELPERIOD構文
PARALLELPERIOD(
    <dates>,               // 日付を含む列
    <number_of_intervals>, // 日付に対する間隔を指定する整数
    <interval>             // 日付をシフトする間隔 YEAR, QUARTER, MONTH, DAYのいずれか
)  
```
　DATEADDとPARALLELPERIODは、同じ引数をとり、同じ動きをするように見えます。

```text:DateAdd
DateAdd := CALCULATE(
    SUM(financials[Sales]),
    DATEADD(DateTable[Date],-1,YEAR)
)
```

```text:ParallelPeriod
ParallelPeriod := CALCULATE(
    SUM(financials[Sales]),
    PARALLELPERIOD(DateTable[Date],-1,YEAR)
)
```

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/62ed9946-4780-1e1b-fadb-cbfb40fe1b64.png"/>

　しかし、ここに月を表示を加えると、以下のようになります。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/79451111-fc50-ce63-46e6-95156a5fdf1e.png"/>

　つまり、`DATEADD` では、1年前の日付を返すのに対して、 `PARALLELPERIOD` は、前年の全ての日付を返しています。

## PREVIOUSMONTH

```text:PREVIOUSMONTH構文
PREVIOUSMONTH(<Dates>)  
```
　前月分の金額が表示されます。

```text:PREVIOUSMONTH例
=CALCULATE(
    SUM(financials[Sales]),
    PREVIOUSMONTH(DateTable[Date])
)
```
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/208fda82-8f2a-ed7d-f318-ee741c4c5f9a.png"/>

 `PREVIOUSMONTH` で返されるのは、前月の日付のテーブルなので、先程の表に日付を加えると、すべての日付に翌月の合計金額が表示されます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/b9b96e89-655b-e8d3-e18f-2e2cd4121e41.png"/>

# タイムインテリジェンスで使わない関数
　以下の関数は、タイムインテリジェンス関数ではありません。

|関数名|構文|説明|
|:--|:--|:--|
DATE|`DATE(<year>, <month>, <day>)`|指定された日付をdatetime形式で返す
TIME|`TIME(hour, minute, second)`|指定された時間をdatetime形式で返す
DATEVALUE|`DATEVALUE(date_text)`|テキスト形式の日付をdatetime形式に変換
TIMEVALUE|`TIMEVALUE(time_text`)|テキスト形式の時刻をdatetime形式に変換
YEAR|`YEAR(<date>)`|日付の年を4桁の整数で返す
MONTH|`MONTH(<datetime>)`|月を数値として返す
DAY|`DAY(<date>)`|月の日付を返す
WEEKDAY|`WEEKDAY(<date>, <return_type>)`|日付の曜日を返す（※１）
WEEKNUM|`WEEKNUM(<date>[, <return_type>])`|日付の週番号を返す（※２）
HOUR|`HOUR(<datetime>)`|時間を０から２３の数値で返す
MINUTE|`MINUTE(<datetime>)`|分を０から５９の数値で返す
SECOND|`SECOND(<time>)`|病を０から５９の数値で返す
NOW|`NOW()`|現在の日時を返す（※３）
TODAY|`TODAY()`|現在の日付を返す（時間は0:00）
EDATE|`EDATE(<start_date>, <months>)`|開始日から指定された月数の日付をdatetime形式で返す（※４）
EOMONTH|`EOMONTH(<start_date>, <months>)`|指定された月数の月の最終日をdatetime形式で返す
YEARFRAC|`YEARFRAC(<start_date>, <end_date>, <basis>)`|2つの日付の間の全日数で表される年の端数を計算します（※５）

※１ return_type
- 1 : 日曜日１から土曜日７
- 2 : 月曜日１から日曜日７
- 3 : 月曜日０から日曜日６

※２ 
　規定では、１月１日が含まれる週を都市の最初の週とみなします。
　return_typeが21の時は、新しい年の日付が４日以上含まれる週が最初の週となります。(ISO 8601)

|return_type|週の始まり|
|:--:|:--:|
1(規定) |日曜日
2|月曜日
11|月曜日
12|火曜日
13|水曜日
14|木曜日
15|金曜日
16|土曜日
17|日曜日
21|月曜日

※３
　エクセルの計算式で使用する`NOW()`関数は、式があるワークシートと別のワークシート上だけでなく、同時に開かれている別のブックのワークシート上であっても計算が行われると、`NOW()`関数は必ず再計算が行われます。
　しかし、DAXの`NOW()`関数は、継続的な更新は行われず、数式を含む列が更新されたときにのみ変更されます。

※４
　monthsの小数点以下は切り捨てられます。
　start_dateがテキストの場合は、PCのロケールと日付時刻設定を使用してテキストを日付に変換します。
　start_dateの日付が該当する月の最終日より後の場合は、その月の最終日が返されます。例えば、`EDATE("2023/1/31", 1)`は、2023年2月28日を返します。

※５

|basis|説明|
|:--:|:--|
0(規定)|US(NASD) 30/360
1|Actual/actual
2|Actual/360
3|Actual/365
4|European 30/360

# コンテンツ
- [雑・Excel入門試論 - 脱VLOOKUPの思考 01 - ブック - 仕様と制限](https://qiita.com/spumoni/items/189004c01181c50a4821)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 02 - ブック - オプション](https://qiita.com/spumoni/items/75955db69cc34695de14)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 03 - ワークシート](https://qiita.com/spumoni/items/5408cae114034be528c4)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 04 - セル - 文字列型](https://qiita.com/spumoni/items/4ab1d7067418886c0582)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 05 - セル - 数値データ](https://qiita.com/spumoni/items/970b4b39a5a2185992ed)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 06 - セル - 日時データ](https://qiita.com/spumoni/items/9f270e181fbc45503759)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 07 -  リンクされたデータ型](https://qiita.com/spumoni/items/ed59d15753d992c3a630)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 08 - セル - 計算式・関数](https://qiita.com/spumoni/items/ae339c97627110e2134e)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 09 -  セル - 数値の書式設定](https://qiita.com/spumoni/items/1b3134d4b0284465976f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 10 - セル - 日付と時刻の書式設定](https://qiita.com/spumoni/items/6eb602f69956a5e1502f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 11 - セル - 条件付き書式](https://qiita.com/spumoni/items/04bd8e24284daef6f27a)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 12 - テーブル - テーブルの作成と入力規則](https://qiita.com/spumoni/items/f23beca01c5093c81c47)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 13 - テーブル - ソートとスライサー](https://qiita.com/spumoni/items/b66027008c2f9edb853f)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 14 - テーブル - 動的配列関数](https://qiita.com/spumoni/items/cc03e898f02b8c3017f7)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 15 - Power Query - エクセルのデータを読み込む](https://qiita.com/spumoni/items/fc38a4ae595b64af87f5)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 16 - Power Query - 変換](https://qiita.com/spumoni/items/100e0e3c6a5a59b03229)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 17 - Power Query - テーブルの結合](https://qiita.com/spumoni/items/debb9ea9b8692ca8fc8c)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 18 パワーピボット - データモデル](https://qiita.com/spumoni/items/08458978e86dc59f18ed)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 19 パワーピボット - 操作](https://qiita.com/spumoni/items/e7b3f245e87622e9bc79)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 20 パワーピボット - 日付テーブル](https://qiita.com/spumoni/items/340e0fcbc9cd10198112)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 21 DAX - コンテキストとイテレーター](https://qiita.com/spumoni/items/cddc7fa16341e20bafb8)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 22 DAX - CALCULATE](https://qiita.com/spumoni/items/e2218fece1ec01e177b0)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 23 DAX - タイムインテリジェンス](https://qiita.com/spumoni/items/6d8aeb9f80ecafb69c5a)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 24 - ダッシュボード - ピボットグラフ（Pivot Chart）](https://qiita.com/spumoni/items/ffb0d57a6272c2e5ad37)
- [雑・Excel入門試論 - 脱VLOOKUPの思考 25 - ダッシュボードの作成](https://qiita.com/spumoni/items/5e57ad587a343857e543)