我有几张票,想要根据与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}'“;
答案 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
为什么要用桌子?