计算两个日期之间的分钟数(仅工作时间)

Jam*_*rry 3 sql sql-server sql-server-2005 sql-server-2008

我需要计算数据库中事件的"活动分钟数".开始时间众所周知.

复杂的是,这些活跃的会议记录只应计算在工作日 - 周一至周五上午9点至下午6点30分,不包括周末和(已知)假日日列表

开始或"当前"时间可能在工作时间之外,但仍然只计算工作时间.

这是SQL Server 2005,因此可以使用T-SQL或托管程序集.

Unr*_*son 5

如果你想这样做纯SQL这里是一种方法

CREATE TABLE working_hours (start DATETIME, end DATETIME);
Run Code Online (Sandbox Code Playgroud)

现在用可数周期填充工作时间表,每年约250行.

如果你有一个事件(@event_start,@ event_end)将开始工作时间并结束时间,然后简单的查询

SELECT SUM(end-start) as duration
FROM working_hours
WHERE start >= @event_start AND end <= @event_end
Run Code Online (Sandbox Code Playgroud)

就足够了.

另一方面,如果事件在工作时间内开始和/或结束,则查询更复杂

SELECT SUM(duration) 
FROM 
(
   SELECT SUM(end-start) as duration
   FROM working_hours
   WHERE start >= @event_start AND end <= @event_end
UNION ALL
   SELECT end-@event_start
   FROM working_hours
   WHERE @event_start between start AND end
UNION ALL
   SELECT @event_end - start
   FROM working_hours
   WHERE @event_end between start AND end
) AS u
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 以上是未经测试的查询,根据您的RDBMS,您可能需要日期/时间函数来聚合和减去日期时间(并且根据上述查询使用的函数可以使用任何时间精度).
  • 可以重写查询以不使用UNION ALL.
  • working_hours表可用于系统中的其他内容,并允许最大的灵活性

编辑:在MSSQL中,你可以使用DATEDIFF(mi,start,end)来获得上面每个减法的分钟数.