2010-03-07 51 views
9

我有一個表,我想跟蹤時間間隔時間最好的方式,使一個有效的條目可能是:什麼是存儲在SQL Server數據庫

  • 1小時3分鐘
  • 47分鐘
  • 10小時
  • 3分鐘14秒

什麼字段類型最適合用於此。我顯然可以使用varchar。 。但我認爲可能會有更好的事情,因爲我想運行查詢來總計大量的記錄時間。

回答

12

不是使用字符類型來存儲日期/時間信息。

在SQL Server 2008中,您有這種類型的time,如果您的時間間隔少於1天,應該使用這種類型。在以前的版本中,或者如果您需要存儲較大的時間間隔,則必須使用datetimesmalldatetime(取決於您需要的精度)。

另一種選擇是選擇一個時間單位 - 比方說分鐘數 - 並且只使用int值來表示單位數。只要確保(a)您選擇的單位實際上足夠精確,可以記錄您需要跟蹤的最小時間間隔;(b)實際數字類型足夠大,可容納您需要跟蹤的最大時間間隔。 A smallint可能足以跟蹤一天內的分鐘數;另一方面,跟蹤10年時間內的毫秒數將不得不存儲爲bigint

5

只需使用整數來存儲以秒爲單位的時間間隔。 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 
2

要看你的時間範圍 - 要麼一切轉換成秒,只是存儲的值作爲INT,或者如果您的時間範圍較大,則可能需要單獨使用小時,分鐘和秒的字段。

此外,SQL Server 2008引入了一個新的TIME data type,它允許您存儲只有時間的值。

2

由於@Aaronaught表示使用日期/時間或日期時間(必要時)數據類型來存儲您的值;但這些類型僅在時間上存儲實例,而不是時間跨度或持續時間。您需要使用兩個字段來存儲間隔,例如[time_span_start]和[time_span_end]。兩者之間的差異會給你的時間間隔。

通過下載Richard T. Snodgrass的「在SQL中開發面向時間的數據庫應用程序」的副本,可以回答您的問題。它是免費提供的PDF,看看這裏:

http://www.cs.arizona.edu/~rts/publications.html

0

相關託尼的回答,您還可以使用單相對於標準的開始時間,這是隱含的所有間隔日期時間列 - 例如: 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和您選擇的任何設計解決方案都應該根據您的所有要求進行驗證。

相關問題