2016-04-28 113 views
1

我正在努力解決我認爲是簡單的SQL查詢問題。運行SQL Server 2014SQL Query - 從日期時間字段開始的平均時間

我有一個SQL表,「訪問」:

Id | EntryTime | Duration 

而且我想找到兩個日期之間日的平均入職時間,同時考慮到這些日期之間的所有記錄。

所以如果我的我的日期之間EntryTime領域是:

2016-04-28 12:00:00 
2016-04-20 10:00:00 
2016-04-19 08:00:00 
2016-04-17 10:00:00 

然後返回的平均時間應該僅僅是:

10:00:00 

日期不應當考慮在所有的,它應以字符串格式返回,或僅返回10:00:00

回答

7
create table mytimes(
    id int identity, 
    mydatetime datetime 
) 

insert into mytimes (mydatetime) values ('2016-04-28 12:00:00') 
insert into mytimes (mydatetime) values ('2016-04-20 10:00:00') 
insert into mytimes (mydatetime) values ('2016-04-19 08:00:00') 
insert into mytimes (mydatetime) values ('2016-04-17 10:00:00') 

SELECT Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time) 
from mytimes 
-- where mydatetime between XXX and YYY 

SELECT convert(varchar(8), Cast(DateAdd(ms, AVG(CAST(DateDiff(ms, '00:00:00', cast(mydatetime as time)) AS BIGINT)), '00:00:00') as Time)) 
from mytimes 
-- where mydatetime between XXX and YYY 

輸出110:00:00.0000000 - 這是一個實際的時間類型如果需要,你可以做更多的事

輸出210:00:00 - 這是輸出爲VARCHAR(8)

添加您的where子句,你認爲合適

的步驟包括

  • 鑄造到Time類型從一個DateTime
  • 使用上TimeAVG,這不是由Time類型支持,所以你必須先轉換Time到毫秒。
  • 轉換毫秒回
  • 一個Time類型爲避免你Arithmetic overflow error converting expression to data type int可以投的DateAdd結果爲BigInt。或者,您可以在DateDiff函數中使用seconds而不是milliseconds函數,除非結果集過大,否則它應該可以工作。

SO來源:

+0

請求輸出的格式錯誤。 – GibralterTop

+1

@GibralterTop - OP確實指定了結果,但從未如果它應該是varchar或類型Time。雖然公平,但我添加了一個轉換爲varchar(8)的另一行來顯示或者可以檢索。 – Igor

+0

我在這個「算術溢出錯誤將表達式轉換爲數據類型int」時出現以下錯誤。 – JonnyKnottsvill

0

邑,你可以使用Time()來完成這件事。

您的查詢就會成爲這樣的(相應的修改)

SELECT COUNT(*) FROM Visits WHERE TIME(EntryTime) > '06:00' AND EntryTime < '18:00'; 
+1

的OP是要求的平均時間,而不是記錄的計數。另外我不相信'TIME(DateTime)'是Sql Server中的一個內置函數,如果可以的話你可以參考文檔嗎? – Igor

1
SELECT CONVERT(TIME, DATEADD(SECOND, AVG(DATEDIFF(SECOND, 0, CONVERT(TIME, EntryTime))), 0)) 
FROM Visits 
WHERE EntryTime >= @begin AND EntryTime <= @end 

的想法來自這裏:T-SQL calculating average time

+0

這得到正確的時間,我將如何修剪結束不顯示毫秒? – JonnyKnottsvill