【问题标题】:TSQL DateRange counting day by daySQL 日期范围逐日计数
【发布时间】:2012-10-22 22:13:00
【问题描述】:

我解决了需要 1 天的问题,但是当我将这些天分成 1 天时,我遇到了问题。

    declare @Start datetime
    declare @Finish datetime
    declare @TimeRange int

    set @Start = N'2012-10-16 00:00:00.000'
    set @Finish = N'2012-10-19 00:00:00.000'
    set @TimeRange = 1 

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

    with TimeRanges as 
    (   select @Start as StartTime, DATEADD(day, @TimeRange, @Start) as EndTime
        union all
        select DATEADD(day, @TimeRange, StartTime), DATEADD(day, @TimeRange, EndTime)
        from TimeRanges
        where EndTime  < @Finish 
    )

timeRanges 表将@Start 和@Finish 分成天数。

这是问题的开始:

 select StartTime, EndTime,TMP.NoOfCalls    
    from (SELECT TOP 1 DATEADD(SECOND, Number, c.SessionStartTime) CallTime, COUNT(C.ScenarioID) NoOfCalls FROM test c
INNER JOIN Numbers N ON N.Number <= DATEDIFF(SECOND, C.SessionStartTime, C.SessionCloseTime) 
where c.SessionStarttime >= @Start and  c.SessionCloseTime <= @Finish
GROUP BY DATEADD(SECOND, Number, c.SessionStartTime)
ORDER BY NoOfCalls DESC
)as TMP left outer join TimeRanges as TR on @Start <= TR.StartTime   and   TR.EndTime <= @Finish
        group by TR.StartTime, TR.EndTime,TMP.NoOfCalls
        order by TR.StartTime

这是我得到的结果:

实际上 260 是 N'2012-10-17 00:00:00.000' 和 N'2012-10-18 00:00:00.000' 之间的结果,但我想要单独的结果。

我的样品测试表:

SessionID    SessionStartTime              SessionCloseTime
24       2012-10-16 01:00:06.000           2012-10-16 01:01:22.000
24       2012-10-16 01:00:08.000           2012-10-16 01:01:10.000
24       2012-10-16 01:00:16.000           2012-10-16 01:01:12.000
24       2012-10-16 01:00:30.000           2012-10-16 01:01:48.000
24       2012-10-16 01:00:41.000           2012-10-16 01:02:08.000
24       2012-10-16 01:00:48.000           2012-10-16 01:01:34.000
24       2012-10-16 01:00:56.000           2012-10-16 01:03:09.000
24       2012-10-16 01:01:02.000           2012-10-16 01:02:13.000
24       2012-10-16 01:01:05.000           2012-10-16 01:03:16.000
24       2012-10-16 01:01:09.000           2012-10-16 01:02:42.000
24       2012-10-16 01:01:15.000           2012-10-16 01:02:48.000
24       2012-10-16 01:01:18.000           2012-10-16 01:02:14.000
24       2012-10-16 01:01:18.000           2012-10-16 01:02:06.000
24       2012-10-16 01:01:42.000           2012-10-16 01:03:16.000
24       2012-10-16 01:01:45.000           2012-10-16 01:03:04.000

【问题讨论】:

  • 在您的问题SELECT 中,您没有使用前面定义的TimeRanges CTE。另外,Numbers 表是什么?
  • 对不起,我更正了 Numbers 只是我在计算 Numbers 表开始时使用的示例 1,2,3....100000
  • 我仍在试图弄清楚你想用这个实现什么。我在sqlfiddle.com/#!3/4970c/11 做了一个在线运行版本。您能否看一下并描述在这种情况下所需的输出是什么?

标签: sql-server tsql date-range


【解决方案1】:

您的问题是左连接,但您的查询似乎过于复杂。

试试

   with TimeRanges as 
    (   select @Start as StartTime, DATEADD(day, @TimeRange, @Start) as EndTime
        union all
        select DATEADD(day, @TimeRange, StartTime), DATEADD(day, @TimeRange, EndTime)
        from TimeRanges
        where EndTime  < @Finish 
    )
        select TimeRanges.StartTime, TimeRanges.EndTime, COUNT(*)
        from TimeRanges
            inner join YourTable Sess
                on sess.sessionstarttime>TimeRanges.StartTime 
                and sess.sessionclosetime< TimeRanges.EndTime
        group by TimeRanges.StartTime, TimeRanges.EndTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2022-06-29
    • 1970-01-01
    相关资源
    最近更新 更多