0

テーブル (ログ アナライザー) の構造は次のとおりです。

ログの表
過去 15 分間から現在の時間 (毎分) までのセッション数を表示する折れ線グラフを描画したいと考えています。次の情報を含む 2 つの列を表示するクエリを作成したいと考えています。

  1. 日付:時:分
  2. セッション数

1 時間あたりのリクエストを表示するサンプル クエリを作成しようとしました。

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 分間のセッション数 (sessionID) を 10:00:00 に表す必要があります。つまり、9:45: 00 から 10:00:00 など

4

1 に答える 1

0

これは少し複雑になります。最初に、1 日を 15 分のチャンクに分割する TimeSlot テーブルを作成する必要があります。

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 に答える