sql-server - 在两个日期之间计数

标签 sql-server tsql datetime stored-procedures date-range

我编写了一个程序,它采用 3 个参数 StartDate、EndDate 和 TimeRange。根据 TimeRange,我的程序拆分日期并分别计算它们。这是我的程序:

PROCEDURE [dbo].[Procedure1] 

    @Start datetime, 
    @Finish datetime,
    @TimeRange time
AS
BEGIN

    SET NOCOUNT ON;

    declare @TimeRanges as TABLE (SessionStart datetime, SessionEnd datetime);

     with TimeRanges as (
  select @Start as StartTime, @Start + @TimeRange as EndTime
  union all
  select StartTime + @TimeRange, EndTime + @TimeRange
    from TimeRanges
    where EndTime  < @Finish )
  select StartTime, EndTime, Count( Test.ScenarioID ) as TotalInboundArrivals
    from TimeRanges as TR left outer join
      dbo.Test as Test on TR.StartTime <= Test.SessionStartTime and Test.SessionCloseTime < TR.EndTime
    where Test.ScenarioID = 24  
    group by TR.StartTime, TR.EndTime   
END

例如,

Start Time: 11:00
End Time: 12:00
TimeRange : 05:00

This procudure splits them like
     TimeRange    TotalCallPeaks
    11:00 11:05      12
    11:05 11:10      8
    11:10 11:15      15 
    etc..

这是我的问题:我需要同时发生的最大调用数。换句话说,我需要通话高峰期。任何建议或线索对我来说都会非常有用。

enter image description here 在这个时间范围内发生了 6 个调用,但其中 4 个是同时发生的,我想计算一下。最大点显示最大调用峰值。第 5 次和第 6 次调用发生在这个时间范围内,但对最大调用峰值没有影响。

最佳答案

这应该是一个 O(n log n) 算法:

  1. 将所有记录转储到#temp 表中
  2. 将时间范围一分为二,运行查询以查看哪个时间范围的调用次数更多
    • 修剪落在另一半的记录
    • 如果两半的调用次数相同,则保留并处理两半。这可能会导致您的工作集从 2 增加到 4 等,但对于无法产生与其他部分相同计数的任何“一半”,可能会再次下降
    • 如果两半包含相同的记录:这个分支可以被标记为完成。调用在整个时间范围内是同时进行的。您可以在此处停止(标记为已完成)以获取“一个答案”或继续查找“所有答案”。

可以处理此问题的 SP 结构草案:

表:#WorkingSets

  • Partition (int) : 最初是左/右,然后是 LLL/LLR/RLR 等
  • session_id :可以同时出现在多个分区
  • session_start
  • session_结束
  • curr_range_start
  • curr_range_end :继续将开始/结束之间的范围减半
  • 完成(位)

变量

  • @max_calls_per_partition:一旦找到任何“最终确定”集就锁定

关于sql-server - 在两个日期之间计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13024909/

相关文章:

java - 如何在java中从sys.tables获取表名?

c# - 从 Visual Studio 2013 数据库项目中清理 SQL Server 数据库

sql-server - 使用 ALTER TABLE 将 varchar 列调整为更大的大小是否不好?

sql-server - 在 SQL 中从 XML 中获取值时添加分隔符

python - 如何自动将时间添加到 django 模型中的日期时间字段?

sql-server - SQL Server MaxDop 不生成并行度

mysql - 如何从字符串中的第一个 Y 之后获取 X 个字符

tsql - 如何查看为查询生成的 SQL Entity Framework ?

python - 从给定日期提取日、月和年的最快方法是什么?

java - DateTimeFormatter 无效日期在 LocalDateTime.parse 之后得到调整