定期的に見かける質問ですが、私はいつも思いつかない。
すぐに探せるようにここに保存しておきます。
DateTimeでの比較
Find business hours between two date/time fields excluding weekends
DateとDateTimeの混在(でも問題ない)
Why is Tuesday off in this days between dates formula?
両方とも機能しています。
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
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つすべてを週の長さに置き換えます。
ロジックの解説
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)
その他の例
(
(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
/*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