1

複数のチケットを持っており、PHP のサービス レベル アグリーメントに基づいてレポートを提供したいと考えています。

新しいチケットは、特定のタイムスタンプでステータスが「新規」になり、しばらくすると特定のタイムスタンプでステータスが「クローズ」になる場合があります。

これら 2 つのタイムスタンプの差を計算する必要がありますが、関連するのは月曜日から金曜日までの勤務時間 (午前 8 時から午後 4 時 30 分) のみです。したがって、チケットが金曜日の午後 4 時に作成され、次の月曜日の午前 9 時にクローズされた場合、経過時間は 1.5 時間になります。

データベースから除外された結果を取得する方法を知っている人はいますか?

データベースは mysql データベースで、バグ追跡システムはオープン ソースの BTS Mantis Bugtracker です。

データベーステーブルの非常に単純な部分:

テーブルのバグ:

ID | ステータス | date_created (タイムスタンプ) | last_modified (タイムスタンプ)

テーブル履歴

ID | bug_id (参照バグ) | status_old | status_new | date_modified (タイムスタンプ)

PHP での私のクエリ: 特定の時間枠でステータス 30 に設定されたすべてのバグを取得します。最高の SLA レベルの場合、このフレームは 0 ~ 2 時間です。クエリは正常に機能しますが、時間枠は勤務時間に関係ありません...

ID として bug.id をバグとして mantis_bug_table、履歴として mantis_bug_history_table として選択します。 - bug.date_submitted) > '{$timeframe_start}'";

4

1 に答える 1

2

すべての作業期間を示す表が必要です。例:

create table WorkingPeriod (
    dtPeriodStart datetime primary key,
    dtPeriodEnd datetime,
    unique(dtPeriodEnd, dtPeriodStart)
)

作業期間が重ならないようにする必要があります。

次に、作業時間を計算できます。これは、期間全体の数に、最初と最後の部分的な期間を加えたものになります。この例はMicrosoftT-SQLで機能するはずですが、MySQLにTIMESTAMPDIFFを使用するか、別の簡単な変更を加える必要がある場合があります。

create function dbo.GetWorkingTimeSeconds(@dtStart, @dtEnd)
returns int 
as
begin
   declare @a int
   -- Add up all the WorkingPeriods between @dtStart and @dtEnd
   -- SUM adds them all up
   select @a = SUM(
       -- Get the number of seconds between the start of the period and the end
       datediff(
           -- We want the difference in seconds
           second,

           -- BUT if @dtStart is after the start of the period, 
           --  use @dtStart instead - so we don't count the part
           -- of the period before @dtStart
           case 
           when @dtStart < dtPeriodStart then dtPeriodStart
           else @dtStart 
           end,

           -- If @dtEnd is BEFORE the end of the period, 
           -- use @dtEnd instead, so we don't count the part of the period after @dtEnd
           case
           when @dtEnd > dtPeriodEnd then dtPeriodEnd
           else @dtEnd
           end
       )
    )
    from
        WorkingPeriods 
        -- Only include periods which overlap our time range
        where dtPeriodEnd >= @dtStart and dtPeriodStart < @dtEnd

    -- return the value
    Return @a
  end   

なぜテーブルを使うのですか?

  • 祝日を含めないことで、祝日を考慮に入れることができます
  • 稼働日が将来変更された場合、テーブルは将来の日付に変更され、過去の日付は変更されないままになる可能性があるため、過去のイベントの稼働時間の計算は引き続き正確です。
  • ランチタイムを除外したり、週末に半日を過ごしたり、その他何でもできます。
于 2012-11-29T14:56:21.330 に答える