営業日(週末を除く)を考慮した日付の追加

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)


# 週末を除いて〇日追加する数式の考察

+ [20日追加](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QLs5q)
+ [Add 20 Business Days to Created Date](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmCaW)


```
DATEVALUE(CreatedDate)+
CASE(WEEKDAY(DATEVALUE(CreatedDate)),
1,29,
7,30,
28)
```

私は計算を間違えてしましたね。今日から数えるのでなく、明日から数えないといけない。
それから１は日曜日、7は土曜日だな。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fade0e9b-7d07-d721-1de2-8c704974ef06.png)




+ [３営業日](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epJtnSAE)

```
TODAY() +
CASE(WEEKDAY( TODAY()),
1, 3,
2, 3,
3, 3,
4, 5,
5, 5,
6, 5,
7, 4,
0 )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/619aab94-3d8d-83ad-a0eb-1068b4690419.png)


# 単純に５日を追加するのではなくて、週末を除いた5営業日を追加して日にちを求める式。

いつもながら、こんなの思いつかん。

+ [Excluding weekends from a date formula field](https://trailblazers.salesforce.com/answers?id=9064S000000kGYl)



# 実際の適用例　商談が作られてからの経過日を営業日で計算する場合

CreatedDate : DateTime
TODAY()     : Date

以下の式はDate型で計算しています。そのためDATEVALUEを使ってフィールド型をそろえています。

```
(5 * ( FLOOR( TODAY() - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD(TODAY() - DATE( 1900, 1, 8), 7 ) ) 
-
(5 * ( FLOOR( ( DATEVALUE(CreatedDate) - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD( DATEVALUE(CreatedDate) - DATE( 1900, 1, 8), 7 ) ) )
```

[calculate number of business days passed since opportunity created date](https://trailblazers.salesforce.com/answers?id=9064S000000kGwiQAE)

# 考え方

2つの日付の間の営業日数を見つける2つの日付の間で
経過した営業日数の計算は、合計経過日数の計算よりも少し複雑です。基本的な戦略は、過去から参照月曜日を選択し、
参照日とあなたの日付の間に何週間と1週間の追加部分が経過したかを調べることです。
これらの値に5日間の稼働週の場合は5を掛けてから、それらの差を使用して営業日を計算します。
この式では、date_1はより新しい日付であり、date_2はより早い日付です。
週の労働時間が5日より短いか長い場合は、数式の5つすべてを週の長さに置き換えます。 

```
(5 * ( FLOOR( ( date_1 - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD( date_1 - DATE( 1900, 1, 8), 7 ) ) )
-
(5 * ( FLOOR( ( date_2 - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD( date_2 - DATE( 1900, 1, 8), 7 ) ) )
```

# 時間バージョン？

+ [【アイデア】Formula for Case Age in Business Hours](https://trailblazer.salesforce.com/ideaView?id=08730000000Br0G)
+ [Trying to calculate PTO hours based on start and end date/time values](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FxV9K)

# こんなやり方もあるよ

```
Follow_Up_Due__c -
CASE( WEEKDAY( TFollow_Up_Due__c), 
1,3,
2,4,
3,4,
4,2,
5,2,
6,2,
7,2
```

[Finding 2 business days prior to date in custom field](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bs6NM)


[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)


この方がわかりやすいな

```
TODAY() + 
CASE( WEEKDAY( TODAY()),
1,2,
2,2,
3,2,
4,2,
5,4,
6,4,
7,3,
0)
```

Returns the day of the week for the given date, using 1 for Sunday, 2 for Monday, through 7 for Saturday.

[Exclude Weekends From Task Due Date Formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bqt02SAB)

# 何週目かを計算する

[Formula to subtract a dynamic number of weekdays from a date](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Elah9)

```
StartDate__c -
IF(AND(NumberOfDays__c<5,OR(WEEKDAY(StartDate__c -NumberOfDays__c)=1, 
WEEKDAY(StartDate__c -NumberOfDays__c)>WEEKDAY(StartDate__c ))),NumberOfDays__c+2,
(( FLOOR( NumberOfDays__c/5)*7+ MOD(NumberOfDays__c,5))+ 
CASE(WEEKDAY(StartDate__c -  (FLOOR(NumberOfDays__c/5)*7+ 
MOD(NumberOfDays__c,5))),7,1,1,2,0)))
```

# 現在の営業時間の式に休日を追加する

[Adding Holidays to Current Business Hours formula](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FSSXJ)

# スタート日と追加したい日数がともに変数の場合

+ [How do I add working days to my date?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifvfm)

:::note

```
CASE( WEEKDAY({!$Record.Date_c} ),
1,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c }/5 -0.1) *2 + {!$Record.NumberOfDays_c },
2,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c +1 }/5 -0.1) *2 + {!$Record.NumberOfDays_c },
3,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c +2 }/5 -0.1) *2 + {!$Record.NumberOfDays_c },
4,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c + 3}/5 -0.1) *2 + {!$Record.NumberOfDays_c },
5,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c + 4}/5 -0.1) *2 + {!$Record.NumberOfDays_c },
6,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c + 5}/5 -0.1) *2 + {!$Record.NumberOfDays_c },
7,{!$Record.Date_c} + FLOOR( {!$Record.NumberOfDays_c }/5 -0.1) *2 + 1 + {!$Record.NumberOfDays_c },
null)
```
:::

スタート日が土曜日の場合が難しい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/19223e23-a748-c9b1-f0c5-99710fba947e.png)