SQL时间戳 - 计算SLA

时间:2012-11-29 14:19:40

标签: mysql sql timestamp

我有几张票,想要根据与PHP的服务水平协议提供报告。

新票证可能具有带有特定时间戳的“新”状态,并且在一段时间后状态“已关闭”并带有特定时间戳。

应计算这两个时间戳之间的差异,但是从星期一到星期五(上午8点到下午4点30分)的工作时间应该是相关的。因此,如果门票在周五下午4点创建,并在下周一上午9点​​关闭,则所用时间应为1.5小时。

任何人都知道如何从数据库中获取例外结果?

数据库是一个mysql数据库,错误跟踪系统是开源BTS Mantis Bugtracker。

数据库表中非常简单的部分:

表错误:

ID |状态| date_created(TIMESTAMP)| last_modified(TIMESTAMP)

表历史

ID | bug_id(ref bug)| status_old | status_new | date_modified(TIMESTAMP)

我在PHP中的查询: 获取在特定时间范围内设置为状态30的所有错误。 对于最高SLA级别,此fram介于0到2小时之间。 查询工作正常 - 但时间表并不关心工作时间......

选择bug.id作为ID     从mantis_bug_table作为bug,mantis_bug_history_table作为历史     WHERE history.new_status = 30和history.bug_id = bug.id     AND(history.date_modified - bug.date_submitted)< '{$ timeframe_end}'     AND(history.date_modified - bug.date_submitted)> '{$ timeframe_start}'“;

1 个答案:

答案 0 :(得分:1)

您需要一张显示所有工作时间的表格,例如:

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

您必须确保工作期间不重叠。

然后你可以计算工作时间。它将是整个期间的数量,加上开始和结束时的部分期间。此示例应适用于Microsoft T-SQL,但您可能必须使用TIMESTAMPDIFF进行MySQL或进行另一个简单的更改。

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   

为什么要用桌子?

  • 您可以考虑公众假期,不包括他们
  • 如果将来工作日发生变化,表格可能会在未来日期发生变化,过去的日期保持不变,因此过去事件的工作时间计算仍然是正确的。
  • 您甚至可以排除午餐时间,周末有半天或其他任何您想要的东西。