2012-05-07 216 views
1

我使用的是SQL Server 2008和尋找如何創建這樣一個查詢經過時間(合計行):SQL查詢來按天,並計算

我有一個表:

Username nvarchar(50), LogDate datetime 

Test1, 2012.01.01 00:00:00 
Test2, 2012.01.01 00:00:02 
Test1, 2012.01.01 00:00:05 
Test3, 2012.01.01 00:00:06 
Test1, 2012.01.02 00:01:01 
Test2, 2012.01.02 00:02:50 
Test1, 2012.01.02 00:01:01 

每幾秒鐘的用戶發送更新以將當前日期時間和他的用戶名插入到日誌表中。我需要計算用戶每天「上網」的時間。

我假設查詢應該在兩行之間使用相同的用戶名按日期分組DateDiff。

我試過使用排名,但沒有得到我想要的。

感謝您提前給予的幫助。

+2

「我想查詢應由天分組相同的用戶名兩行之間總結DateDiff的。」可能不會。如果我在午夜後登錄幾分鐘,然後在下一個午夜之前再次登錄幾分鐘,那麼該算法將顯示幾乎24小時而不是4或5分鐘。 –

+0

在表格中插入一行是非常糟糕的。只需插入並記錄他們登錄時的開始時間,並定期更新結束時間。這樣,你知道他們在你的網站上花了多長時間。 –

+0

現在,我並不是說這是一種跟蹤用戶的好方法,但是我有一個類似於此的問題。我基本上把這一天分成幾分鐘,並在那一分鐘內檢查「準時」。 http://stackoverflow.com/questions/761700/how-can-i-check-for-average-concurrent-events-in-a-sql-table-based-on-the-date – scottm

回答

1

您可以通過用戶名提取DateTime和組的日期部分使用則DateDiff的最小值/最大值:

表和數據設置:

create table UserLog (Username nvarchar(50), LogDate DateTime); 

insert into UserLog Values('Test1', '2012-01-01 00:00:00'); 
insert into UserLog Values('Test2', '2012-01-01 00:00:02'); 
insert into UserLog Values('Test1', '2012-01-01 00:00:05'); 
insert into UserLog Values('Test3', '2012-01-01 00:00:06'); 
insert into UserLog Values('Test3', '2012-01-01 00:01:26'); 
insert into UserLog Values('Test3', '2012-01-01 00:03:22'); 
insert into UserLog Values('Test3', '2012-01-01 00:05:42'); 
insert into UserLog Values('Test3', '2012-01-01 00:00:06'); 
insert into UserLog Values('Test1', '2012-01-02 00:01:01'); 
insert into UserLog Values('Test2', '2012-01-02 00:02:50'); 
insert into UserLog Values('Test1', '2012-01-02 00:01:01'); 

然後可以選擇如下:

select UserName, CAST(LogDate AS DATE) as BusinessDay, 
MIN(LogDate) as FirstLogEntry, MAX(LogDate) as LastLogEntry, 
DATEDIFF(second,MIN(LogDate), MAX(LogDate)) as ElapsedSeconds 
FROM UserLog 
GROUP BY Username, CAST(LogDate AS DATE) 

這將產生以下結果,您可以從秒計算小時數。我發現秒基礎上擴大了與TEST3用戶的樣本數據:

UserName BusinessDay FirstLogEntry   LastLogEntry   ElapsedSeconds 
-------- ----------- ----------------------- ----------------------- -------------- 
Test1 2012-01-01 2012-01-01 00:00:00.000 2012-01-01 00:00:05.000 5 
Test2 2012-01-01 2012-01-01 00:00:02.000 2012-01-01 00:00:02.000 0 
Test3 2012-01-01 2012-01-01 00:00:06.000 2012-01-01 00:05:42.000 336 
Test1 2012-01-02 2012-01-02 00:01:01.000 2012-01-02 00:01:01.000 0 
Test2 2012-01-02 2012-01-02 00:02:50.000 2012-01-02 00:02:50.000 0 
+0

感謝tou,tawman,但是如果用戶在午夜後登錄幾分鐘,然後在下一個午夜之前再次登錄幾分鐘,那麼該算法將顯示24小時而不是4或5分鐘。 – norcis