週末を除く2つの日付/時刻フィールド間の営業時間を検索

定期的に見かける質問ですが、私はいつも思いつかない。
すぐに探せるようにここに保存しておきます。

DateTimeでの比較
[Find business hours between two date/time fields excluding weekends](https://trailblazers.salesforce.com/answers?id=9064S000000Dfe5QAC)


DateとDateTimeの混在（でも問題ない）

[Why is Tuesday off in this days between dates formula?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000FWlWOSA1)

両方とも機能しています。

```
CASE(MOD( DATEVALUE(Available_Date__c)- DATE(1985,6,24),7), 
0 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,2,2,3,3,4,4,5,5,5,6,5,1), 
1 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,2,2,3,3,4,4,4,5,4,6,5,1), 
2 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,2,2,3,3,3,4,3,5,4,6,5,1), 
3 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,2,2,2,3,2,4,3,5,4,6,5,1), 
4 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,1,2,1,3,2,4,3,5,4,6,5,1), 
5 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,0,2,1,3,2,4,3,5,4,6,5,0), 
6 , CASE( MOD( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c),7),1,1,2,2,3,3,4,4,5,5,6,5,0), 
999) + 
(FLOOR(( MPM4_BASE__Actual_Finish_Date__c - DATEVALUE(Available_Date__c))/7)*5) -1
```

```
CASE(MOD( Available_Date2__c - DATE(1985,6,24),7), 
0 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,2,2,3,3,4,4,5,5,5,6,5,1), 
1 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,2,2,3,3,4,4,4,5,4,6,5,1), 
2 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,2,2,3,3,3,4,3,5,4,6,5,1), 
3 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,2,2,2,3,2,4,3,5,4,6,5,1), 
4 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,1,2,1,3,2,4,3,5,4,6,5,1), 
5 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,0,2,1,3,2,4,3,5,4,6,5,0), 
6 , CASE( MOD( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c,7),1,1,2,2,3,3,4,4,5,5,6,5,0), 
999) 
+ 
(FLOOR(( MPM4_BASE_Actual_Finish_Date__c - Available_Date2__c)/7)*5) -1
```

[Calculate working days between two date/time field excluding weekends with fraction value
](https://developer.salesforce.com/forums/?id=906F0000000BPO7IAO)

FLOOR
最も近い整数に切り捨てられた数値を返します。負の場合はゼロになります。

FLOOR(2.5)2を返します。これは、最も近い整数に切り捨てられた2.5です。

FLOOR(-2.5)-2を返します。これは、負の数の場合はゼロに向かって-2.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 ) ) )
```

2つの日付の間に経過した平日数の計算は、合計経過日数の計算よりも少し複雑です。この例では、平日は月曜日から金曜日です。基本的な戦略は、過去から参照月曜日を選択し、参照日とあなたの日付の間に何週間と1週間の追加の部分が経過したかを調べることです。これらの値に5日間の稼働週の場合は5を掛けてから、それらの値の差を使用して平日を計算します。

この式では、date_1はより新しい日付であり、 date_2はより早い日付です。週の労働時間が5日より短いか長い場合は、数式の5つすべてを週の長さに置き換えます。

# ロジックの解説

[元の質問](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HENeb)


Calculate how many weeks the two dates are separated by the following formula.
Weekends are excluded, so one week is calculated as 5 days.

```
(FLOOR(( EndDate__c - StartDate__c )/7)*5) 
```

This part calculates the difference between the days of the week on the two dates.

```
CASE(MOD( StartDate__c - TODAY(),7), 
  0 , CASE( MOD( EndDate__c - StartDate__c ,7),1,2,2,3,3,4,4,5,5,5,6,5,1), 
  1 , CASE( MOD( EndDate__c - StartDate__c ,7),1,2,2,3,3,4,4,4,5,4,6,5,1), 
  2 , CASE( MOD( EndDate__c - StartDate__c ,7),1,2,2,3,3,3,4,3,5,4,6,5,1), 
  3 , CASE( MOD( EndDate__c - StartDate__c ,7),1,2,2,2,3,2,4,3,5,4,6,5,1), 
  4 , CASE( MOD( EndDate__c - StartDate__c ,7),1,1,2,1,3,2,4,3,5,4,6,5,1), 
  5 , CASE( MOD( EndDate__c - StartDate__c ,7),1,0,2,1,3,2,4,3,5,4,6,5,0), 
  6 , CASE( MOD( EndDate__c - StartDate__c ,7),1,1,2,2,3,3,4,4,5,5,6,5,0), 
  1) 
```

Combine these two formulas to calculate the difference between the two dates.

この部分の説明
CASE( MOD( EndDate__c – StartDate__c ,7),1,2,2,3,3,4,4,5,5,5,6,5,1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7a212660-3b82-13e4-997b-7fe848fe7a22.png)

# その他の例

+ [Formula in report remove weekends](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000KeIne)

```
(
(5 * ( FLOOR( A - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD(A - DATE( 1900, 1, 8), 7 ) ) 
-
(5 * ( FLOOR( ( B - DATE( 1900, 1, 8) ) / 7 ) ) + MIN( 5, MOD( B - DATE( 1900, 1, 8), 7 ) ) )
) * 24
```

+ [I want to calculate the difference between 2 dates and exclude weekends](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aibJrSAI)

```
/*Calculate the number of days between the 2 dates*/
((DATETIMEVALUE(CREATED_DATE)-DATETIMEVALUE(CASE_CREATED_DATE))
/*Remove the number of weekend days*/
-
(FLOOR((DATETIMEVALUE(CREATED_DATE)-DATETIMEVALUE(CASE_CREATED_DATE))/7)*2
+
IF(AND(WEEKDAY(DATETIMEVALUE(CASE_CREATED_DATE))=1,WEEKDAY(DATETIMEVALUE(CREATED_DATE))<>7),1,
IF(CASE(WEEKDAY(DATETIMEVALUE(CASE_CREATED_DATE)),1,8,WEEKDAY(DATETIMEVALUE(CASE_CREATED_DATE)))>CASE(WEEKDAY(DATETIMEVALUE(CREATED_DATE)),1,8,WEEKDAY(DATETIMEVALUE(CREATED_DATE))),2,
IF(OR(WEEKDAY(DATETIMEVALUE(CREATED_DATE))=7,WEEKDAY(DATETIMEVALUE(CASE_CREATED_DATE))=1),1,
IF(OR(WEEKDAY(DATETIMEVALUE(CREATED_DATE))=1,WEEKDAY(DATETIMEVALUE(CASE_CREATED_DATE))=7),2,
0))))))
*24
```