2011-10-14 29 views
0

我想保存用戶在執行各種活動時的日期和時間。對於日期,我決定在數據庫中使用DateTime Column,對於時間我處於兩難境地,需要什麼數據類型。在數據庫中存儲「時間」 - 使用什麼DateTime/Interger/VarChar

我知道在SQL Server 2008時間數據類型已經引入,但我使用的是舊版本,即Sql Server 2005所以我需要你的建議來證明我的理解是真的還是假的。

我見過使用varchar或DateTime將時間存入數據庫的人。但我期待使用Integer數據類型。

我選擇的理由是表現。

以下是我給自己的理由。

假設

任何數據保存到數據庫必須同意下列規則

日期將被存儲在格式mm/dd/yyyy的HH:MM:SS,其中HH:MM:SS將總是00:00:00 時間將被存儲在有效的格式(從HH:MM:SS爲HHMMSS)

if hh is 00 
    then MMss 
and if MM is 00 
    then ss 
and if ss is 00 
    then 0 

hh will range in between 0-23 
MM will range in between 0-59 
ss will range in between 0-59 

i.e. few examples 
00:00:00 = 0 
00:01:00 = 100 
01:00:00 = 10000 
13:00:00 = 130000 

個人雖然爲什麼它會表現更好。

SELECT * FROM Log WHERE loginDate = '05/23/2011' 
AND loginTime BETWEEN 0 AND 235959 --Integer Comparison 

當基於日期時間使用JOINS時,考慮只考慮加入日期部分。

無論時間如何,在共同日期的基礎上加入兩個表。如果使用DateTime作爲存儲數據類型,我認爲類型轉換會嚴重影響這種情況。

由於Sql將不得不做一個整數比較,並且不需要類型轉換,因此它應該表現得更好。

編輯

一個我能發現的缺點是,當我想這兩個時間之間的差多少時間已經3天用了,希望那將成爲整個應用程序管理的噩夢。

+0

如果您需要同時存儲這兩個數據,爲什麼不用datetime存儲時間? –

+0

@JeremySmyth:在某些地方我們需要跟蹤開始時間和結束時間,而且我仍然在尋找正確和更好的方法......請建議 –

+0

的優缺點沒有任何理由不能跟蹤,根據您將它作爲DateTime的一部分存儲的時間進行計算和查詢。只需使用現有的字段。 –

回答

1

那麼,爲什麼你需要2列。如果DateTime列(loginDate)的空閒時間爲00:00:00,那麼爲什麼不爲loginTime使用該空白空間並且只有一列。

WHERE loginDate >= '05/23/2011' AND loginDate < '05/24/2011' 

如果您打算使用整數,那麼它沒有任何問題。

+0

...或'WHERE CONVERT(varchar(10),loginDate,101)= '05/23/2011'' –

+0

@JeremySmyth:如果我使用轉換,則索引不會被應用。 –

+0

@LastCoder:在絕大多數地方,我們只會根據日期提取數據,而不考慮時間。即我們需要覆蓋整天的數據,而不考慮時間......有時候,我們需要在日期的基礎上使用JOINS而不是時間,然後在這些地方我們必須進行類型轉換。我認爲這會減緩這一進程。 –

1

銘記你的編輯,你理想的解決辦法是把日期和時間在同一列中,DATETIME

  • 然後你可以平凡與DATEDIFF
  • 身影開始和結束時間之間的區別
  • 您可以輕鬆地建立只是CONVERT(varchar(10), loginDate, 101)
  • 日期部分,您可以方便地建立只是CONVERT(varchar(10), loginDate, 108)
時間部分0

如果不需要精度< 1分鐘,則可以使用SMALLDATETIME來解決存儲問題。 SMALLDATETIME每列需要四個字節,與INTEGER相同,所以相比使用兩列,您獲得了顯着的淨收益。

相關問題