2011-08-20 122 views
1

我有一個數據輸入表單,任何人都必須填寫3個表單。我記錄表格1,表格2,表格3的入場時間。現在我想知道填寫表格給所有人的平均時間是多少。我怎樣才能做到這一點?SQL Server DateTime列的差異平均值

+0

我們不能從您的數據告訴它花了多長時間來填寫表格,請更準確地瞭解您的問題。 –

+0

我說** LIKE **,我沒有3個人...我想要一個腳本或指南 – Arian

+1

您的模式是什麼樣的?對於每個日誌條目,您是否有一行(例如,您爲每個表單插入一個新行),還是每行表單都有一行包含一列?你可以顯示CREATE TABLE語句嗎? –

回答

2

基於極爲模糊的要求進行100%猜測。

DECLARE @x TABLE 
(
    UserID INT, 
    FormID TINYINT, 
    StartTime DATETIME, 
    EndTime DATETIME 
); 

INSERT @x VALUES 

-- a user who has completed all three forms 
    (1,1,'20110820 04:25:01','20110820 04:33:07'), 
    (1,2,'20110820 04:34:05','20110820 04:38:33'), 
    (1,3,'20110820 04:39:02','20110820 04:47:55'), 

-- a user who has completed two forms 
    (2,1,'20110820 04:25:54','20110820 04:29:32'), 
    (2,2,'20110820 04:30:55','20110820 04:34:27'), 

-- the same user who has completed 1.5 forms 
    (2,1,'20110820 04:35:23','20110820 04:37:15'), 
    (2,2,'20110820 04:38:34',NULL), 

-- the same user who has completed all three forms 
    (2,1,'20110820 04:45:12','20110820 04:49:07'), 
    (2,2,'20110820 04:50:26','20110820 04:55:31'), 
    (2,3,'20110820 04:56:41','20110820 05:01:23'), 

-- a slow user who has completed all three forms 
    (3,1,'20110820 05:25:04','20110820 05:43:07'), 
    (3,2,'20110820 05:44:09','20110820 05:55:21'), 
    (3,3,'20110820 05:59:41','20110820 06:24:23'); 

下面是我猜會打你要找的人一些典型的聚合:

SELECT -- avg by form regardless of user 
    FormID, 
    completed_forms = COUNT(*), 
    average = AVG(DATEDIFF(SECOND, StartTime, EndTime)) 
FROM @x GROUP BY FormID; 

SELECT -- avg by form and user 
    UserID, 
    FormID, 
    completed_forms = COUNT(*), 
    [seconds] = AVG(DATEDIFF(SECOND, StartTime, EndTime)) 
FROM @x GROUP BY UserID, FormID; 

SELECT -- avg by user regardless of form 
    UserID, 
    completed_forms = COUNT(*), 
    [seconds] = AVG(DATEDIFF(SECOND, StartTime, EndTime)) 
FROM @x GROUP BY UserID; 

-- if you want hh:mm:ss format and the form never takes > 24 hours to complete, 
-- you can do this kind of thing to any of the above queries: 

;WITH x(FormID, completed_forms, average) AS 
(
    SELECT 
     FormID, 
     COUNT(*), 
     AVG(DATEDIFF(SECOND, StartTime, EndTime)) 
    FROM @x GROUP BY FormID 
) 
SELECT 
    FormID, 
    completed_forms, 
    [hh:mm:ss] = CONVERT(CHAR(8), (CONVERT(TIME(0), DATEADD(SECOND, average, '19000101')))) 
FROM x; 
1

好吧,因爲我理解你的問題。假設您在用戶點擊完成按鈕時最後將所有三種表單數據放入數據庫中。按照以下步驟實現您的目標。

  1. 當您的嚮導上的第一個導航或打開時保持嚮導啓動時間。

  2. 讓用戶完成他們的嚮導,當他點擊完成按鈕 保持完成時間在內存

條件的

  1. 如果用戶沒有完成有嚮導,然後清除memroy放入這個 嚮導。

實施例: 用戶已經在下午6時00分45秒開始的嚮導,並在下午6時12分15秒完成它,以便計算此使用之間這段時間SQL的DATEDIFF函數

使用下面作爲線根據您的要求

SELECT DATEDIFF(hour,@StartTime,@EndTime); 精靈fillup返回小時

SELECT DATEDIFF(minute,@ StartTime,@ EndTime); 返回分鐘嚮導嚮導fillup

SELECT DATEDIFF(second,@StartTime,@EndTime); 返回秒精靈fillup採取

SELECT DATEDIFF(毫秒,@ StartTime,@EndTime); 用於嚮導填充的返回毫秒數

+0

很確定尼瑪希望單獨測量每種形式,而不是整個過程的時間。 –