我有一個表,我想跟蹤時間間隔時間最好的方式,使一個有效的條目可能是:什麼是存儲在SQL Server數據庫
- 1小時3分鐘
- 47分鐘
- 10小時
- 3分鐘14秒
什麼字段類型最適合用於此。我顯然可以使用varchar。 。但我認爲可能會有更好的事情,因爲我想運行查詢來總計大量的記錄時間。
我有一個表,我想跟蹤時間間隔時間最好的方式,使一個有效的條目可能是:什麼是存儲在SQL Server數據庫
什麼字段類型最適合用於此。我顯然可以使用varchar。 。但我認爲可能會有更好的事情,因爲我想運行查詢來總計大量的記錄時間。
做不是使用字符類型來存儲日期/時間信息。
在SQL Server 2008中,您有這種類型的time
,如果您的時間間隔少於1天,應該使用這種類型。在以前的版本中,或者如果您需要存儲較大的時間間隔,則必須使用datetime
或smalldatetime
(取決於您需要的精度)。
另一種選擇是選擇一個時間單位 - 比方說分鐘數 - 並且只使用int
值來表示單位數。只要確保(a)您選擇的單位實際上足夠精確,可以記錄您需要跟蹤的最小時間間隔;(b)實際數字類型足夠大,可容納您需要跟蹤的最大時間間隔。 A smallint
可能足以跟蹤一天內的分鐘數;另一方面,跟蹤10年時間內的毫秒數將不得不存儲爲bigint
。
只需使用整數來存儲以秒爲單位的時間間隔。 DATEDIFF返回整數。編寫一個將其轉換爲文本的函數。這其中需要一些adjustmens(所以它顯示「1分鐘」,而不是「1分鐘」),但應該可以正常工作:
CREATE FUNCTION dbo.SecondsToText(@seconds int)
RETURNS VARCHAR(100)
AS
BEGIN
declare @days int;
set @days = @seconds/(3600 * 24);
declare @hours int;
set @hours = (@seconds - @days * 3600 * 24)/3600;
declare @minutes int;
set @minutes = (@seconds - @days * 3600 * 24 - @hours * 3600)/60;
set @seconds = (@seconds - @days * 3600 * 24 - @hours * 3600 - @minutes * 60);
RETURN
RTRIM(CASE WHEN @days > 0 THEN CAST(@days as varchar) + ' days ' ELSE '' END +
CASE WHEN @hours > 0 THEN CAST(@hours as varchar) + ' hours ' ELSE '' END +
CASE WHEN @minutes > 0 THEN CAST(@minutes as varchar) + ' minutes ' ELSE '' END +
CASE WHEN @seconds > 0 THEN CAST(@seconds as varchar) + ' seconds ' ELSE '' END)
END
GO
要看你的時間範圍 - 要麼一切轉換成秒,只是存儲的值作爲INT,或者如果您的時間範圍較大,則可能需要單獨使用小時,分鐘和秒的字段。
此外,SQL Server 2008引入了一個新的TIME
data type,它允許您存儲只有時間的值。
由於@Aaronaught表示使用日期/時間或日期時間(必要時)數據類型來存儲您的值;但這些類型僅在時間上存儲實例,而不是時間跨度或持續時間。您需要使用兩個字段來存儲間隔,例如[time_span_start]和[time_span_end]。兩者之間的差異會給你的時間間隔。
通過下載Richard T. Snodgrass的「在SQL中開發面向時間的數據庫應用程序」的副本,可以回答您的問題。它是免費提供的PDF,看看這裏:
相關託尼的回答,您還可以使用單相對於標準的開始時間,這是隱含的所有間隔日期時間列 - 例如: 1/1/1900 12:00 AM。
在這種情況下,它是很容易的存儲:
INSERT INTO tbl (interval) VALUES (DATEADD(s, '1/1/1900', DATEDIFF(s, @starttime, @endtime))
現在,這顯然不是容易做行的資金,所以你可以考慮增加持續DATEDIFF的計算列(S)(S, '1/1/1900',間隔)來提供執行SUM的秒數。現在
,這裏就是它的SQL Server變得有趣:
因爲SQL Server的實現將數字轉換和從日期,0 - > 1/1/1900上午12:00,0.5 - > 1/1/1900 12:00 PM,1 - > 1/2/1900 12:00 AM等,即整個數字被視爲自1/1/1900以來的天數,小數部分是一天內的分數。所以你可以天真地添加這些來獲得間隔。
而事實上:
SELECT CONVERT(DATETIME, 1) + CONVERT(DATETIME, 0) + CONVERT(DATETIME, 2) + CONVERT(DATETIME, 0.5)
給 '1900年1月4日12:00:00.000' 作爲預期
這樣你就可以做到這一點(通過轉換四處SUM):
DECLARE @datetest TABLE (dt DATETIME NOT NULL)
INSERT INTO @datetest (dt)
VALUES (0)
INSERT INTO @datetest (dt)
VALUES (1)
INSERT INTO @datetest (dt)
VALUES (2)
INSERT INTO @datetest (dt)
VALUES (0.5)
SELECT *
FROM @datetest
SELECT CONVERT(DATETIME, SUM(CONVERT(FLOAT, dt)))
FROM @datetest
我並不是主張這樣做,YMMV和您選擇的任何設計解決方案都應該根據您的所有要求進行驗證。