期間とビジネス期間の計算の仕組みIssue 履歴: [ビジネス期間 (Business Duration)] フィールドは、2010 年より前の古い SLA エンジンの一部として使用されていました[期間 (Duration)] フィールドも、旧バージョンの製品から受け継がれたものです。これにより提供される情報を取得するには、今ではもっと優れた方法があります。 仕組み: さまざまなタスクテーブルに対してこれらの操作を処理するビジネスルールは多数存在します。Calgary CCA6 の時点で関連しているビジネスルールは次のとおりです。 1) (インシデント) mark_resolved は、incident_state が解決済みになったときに、これらのフィールドを設定します。/nav_to.do?uri=sys_script.do?sys_id=d3b21f640a0a3c7400f6acab7de3f5f8 2) (インシデント) mark_closed は、incident_state がクローズ済みになったときに、これらのフィールドを設定します (上のルールで設定済みでない場合)。/nav_to.do?uri=sys_script.do?sys_id=bf3f8917c0a8016400a867dc0794e8ad 3) (sc_task) チケットを閉じます。/nav_to.do?uri=sys_script.do?sys_id=74d38bd0c611227d0151ca6b62ae87e6 4) (change_task) チケットを閉じます。/nav_to.do?uri=sys_script.do?sys_id=9023ada50a0a0b01004228007704cf66 5) (問題) mark_closed。/nav_to.do?uri=sys_script.do?sys_id=12a53c4fc6112275000bc7c04a87cfb6 6) (change_request) mark_closed。/nav_to.do?uri=sys_script.do?sys_id=6e20e124c611228e00e44dd37ad1b842 calDateDiff 期間は、インシデントがクローズされたクローズ時刻に基づいて計算されます。解決された時刻ではありません。これは、たとえば、インシデントテーブルの「mark_closed」ビジネスルールによって行われます。また、ルールでは 1 つのカレンダーのみが使用されるため、期間の長さはそのカレンダーに基づきます。2 日間という期間はカレンダー時間の 48 時間を表します。 すべてのケース (ただし change_request の「mark_closed」を除く) で、これらには GlideSystem 関数 calDateDiff が使用されます。 current.business_duration =gs.calDateDiff(current.opened_at.getDisplayValue(), current.closed_at.getDisplayValue(), false); calDateDiff 関数はスケジュールを使用せず、カレンダーを使用します ([システムポリシー] > [カレンダー]) 。カレンダーは 1 つだけです (「月曜日から金曜日 (9 ~ 5)」)。 複数のカレンダーがある場合は、最初に見つかったカレンダーのみ使用されます。したがって、その 1 つのカレンダーを必要なものに変更することをお勧めします。と言うのも、calDateDiff ではデフォルトのカレンダーが使用されるためです。言い換えると、データベースによって任意に返される [sys_calendar] テーブル内の最初のレコードが使用されます。 ビジネス期間はどのように計算されますか。 ユースケースに従って resolved_by/closed_by ユーザーとして代理操作した後にカレンダー日の値を検証する必要があります。そうすると、この計算方法を関連付けて理解できるようになります。 mark_resolved BR とmark_closed BR は、従来の API calDateDiff を使用します。API calDateDiff では、sys_calendar からの最初のカレンダーが考慮され、ユーザーのセッションタイムゾーンを使用して期間が計算されます。こちらの視点からこれを理解しようとすると、計算が誤っているように思えます。 いくつかのユースケースを見て、ビジネス期間の計算の仕組みを理解しましょう。 INC0010120オープン日時:2022-11-09 16:36:30 UTC (ロンドン時間 2022-11-09 08:36:30)解決日時:2022-11-09 16:39:38 UTC (ロンドン時間 2022-11-09 08:39:38)解決者:Gary SN解決者のタイムゾーン:ヨーロッパ/ロンドンカレンダー日:ロンドン時間で水曜日午後 5 時~午前 1 時ビジネス期間:0理由:ビジネス期間は calDateDiff 関数を使用して計算されるため、インシデントを解決するユーザーのタイムゾーンが考慮されます。このケースでは、Gary SN のタイムゾーンはロンドンであり、インシデントのオープン (ロンドン時間 8:36:30 AM) と解決 (ロンドン時間 8:39:38 AM)は、ロンドン時間で午後 5 時から午前 1 時までの営業時間の範囲外です。 INC0010121オープン日時:2022-11-08 16:49:47 UTC (ロンドン時間 2022-11-08 08:49:47)解決日時:2022-11-09 16:50:14 UTC (ロンドン時間 2022-11-09 08:50:14)解決者:Gary SN解決者のタイムゾーン:ヨーロッパ/ロンドンカレンダー日:ロンドン時間で火曜日午後 5 時~午前 1 時ビジネス期間:8 時間計算:カレンダーに基づくA) ロンドン時間 2022-11-08 08:49:47 AM からロンドン時間 2022-11-08 05:00:00 AM までは、0 時間B) 2022-11-08 5:00:00 PM から 2022-11-09 1:00:00 AM までは、8 時間C) 2022-11-09 1:00:00 AM から 2022-11-09 08:50:14 AM までは、0 時間したがって、A + B + C = 8 時間 INC028853495インスタンス:santandertestオープン日時:2022-11-07 15:41:27 UTC (マドリード時間 2022-11-07 16:41:27)解決日時:2022-11-07 15:43:58 UTC (マドリード時間 2022-11-07 16:43:58)解決者:JORGE GARCIA AGUILAR解決者のタイムゾーン:ヨーロッパ/マドリードカレンダー日:マドリード時間で水曜日午後 6 時から午前 2 時ビジネス期間:0理由:ビジネス期間は calDateDiff 関数を使用して計算されるため、インシデントを解決するユーザーのタイムゾーンが考慮されます。このケースでは、JORGE GARCIA AGUILAR のタイムゾーンはヨーロッパ/マドリードであり、インシデントのオープン (マドリード時間 04:41:27) と解決 (マドリード時間 04:43:58) は、マドリード時間で午後 6 時から午前 2 時までの営業時間の範囲外です。 特定のオープン日時および解決日時のビジネス期間を検証するために、以下のスクリプトを使用できます。これは、ユーザーのタイムゾーン (このスクリプトを実行しているユーザー) を必要なタイムゾーンに変更した後で実行する必要があります。 var opened = new GlideDateTime('2022-11-07 15:41:27'); gs.info(opened.getDisplayValue()); var resolved = new GlideDateTime('2022-11-07 15:43:58'); gs.info(resolved.getDisplayValue()); gs.info(gs.calDateDiff(opened.getDisplayValue(), resolved.getDisplayValue(), false)); スケジュールに基づいてビジネス期間を計算するにはどうしたらよいですか。 ビジネスルール (「mark_closed」および「mark_resolved」) 内での calDateDiff への既存の呼び出しを、スケジュールに基づいて期間を計算するロジックに置き換える必要があります。 スケジュールを作成するか、既存のベースシステムスケジュールを使用してください。環境に最適なスケジュールタイムゾーンを確実に選択するようにしてください。 たとえば米国/太平洋のタイムゾーンを定義すると、米国/太平洋タイムゾーンで適用されるスケジュールスパンに基づいて期間が計算されます。 選択したスケジュールの sys_id をコピーし、mark_closed ビジネスルールおよび mark_resolved ビジネスルールのスクリプトを次のように変更します。 // デフォルトの Workday 8 〜 5 流動スケジュール。使用するスケジュールの sys_id に置き換えますvar schedule = new GlideSchedule("38f8b6d2c0a801640075da0e39d47696"); // 「mark_closed」ビジネスルールには closed_at を使用し、「mark_resolved」ビジネスルールには resolved_at を使用しますvar duration = schedule.duration(current.opened_at.getGlideObject(), current.closed_at.getGlideObject()); // 値を GlideDuration として保存しますcurrent.business_duration = duration; // 値は秒単位で保存します。数値関数では値がミリ秒単位で返されるため、1000 で除算しますcurrent.business_stc = duration.getNumericValue() / 1000;