LoginSignup
0
0

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

Last updated at Posted at 2021-03-01

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

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)

image.png

その他の例

(
(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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0