0

表(日志分析器)结构是:

日志表
我想绘制一个折线图,显示过去 15 分钟到当前时间(每分钟)的会话数。我想编写一个查询,它显示包含以下信息的两列:

  1. 日期:时:分
  2. 会话数

我试图编写一个显示每小时请求的示例查询:

select  convert(nvarchar(16), L.TimeLog, 120) requestTime ,(select Count(SessionID) from LogData where TimeLog <  convert(nvarchar(16), TimeLog, 120) and TimeLog >  DATEADD (mi , -15 , convert(nvarchar(16), TimeLog, 120) ) ) AS Sessions
from  LogData L
group by convert(nvarchar(16), TimeLog, 120) order by requestTime;

我试图创建一个类似于上面的查询,但它显示错误的结果。它应该每 15 分钟显示一些会话。并且 group by 子句将保持不变(即每分钟) 例如:在 10:00:00 它应该代表过去 15 分钟到 10:00:00 的会话数(sessionID),即:9:45: 00 至 10:00:00 以此类推

4

1 回答 1

0

这个有点复杂。首先,您需要创建一个 TimeSlot 表,将一天分成 15 分钟的块。

CREATE TABLE [TimeSlot](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [BeginTime] [datetime] NULL,
    [EndTime] [datetime] NULL
) ON [PRIMARY]

填写表格:

DECLARE @Start DATETIME
SET @Start='00:00:00'

WHILE (@Start <'23:59:00')
BEGIN
    INSERT INTO TimeSlot(BeginTime, EndTime) values (@Start,dateadd(mi,15,@Start))
    SET @Start=dateadd(mi,15,@Start)
END

然后,对于丑陋的 SQL:

SELECT  convert(nvarchar(8), L.TimeLog,112) + ' ' +  convert(nvarchar(8), S.BeginTime, 108) AS SlotBeginTime ,Count(LogID) AS Sessions
FROM  LogData L, TimeSlot S
WHERE (convert(nvarchar(8), L.TimeLog,112) +  convert(nvarchar(8), L.TimeLog, 108))  >= (convert(nvarchar(8), L.TimeLog,112)+ convert(nvarchar(8), S.BeginTime,108)) 
  AND (convert(nvarchar(8), L.TimeLog,112) +  convert(nvarchar(8), L.TimeLog, 108))  < (convert(nvarchar(8), L.TimeLog,112)+ convert(nvarchar(8), S.EndTime,108))
GROUP BY convert(nvarchar(8), L.TimeLog,112) + ' ' +  convert(nvarchar(8), S.BeginTime, 108) 
ORDER BY SlotBeginTime;

试试看。我没有检查它在多个日期的效果如何,但它确实适用于单个日期。

于 2012-06-11T16:31:15.210 回答