2012-04-13 74 views

回答

6

日期時間需要每個值8個字節

日期是3個字節。

我不能說低水平的表現;然而,通常我們發現在默認情況下將值存儲爲DateTime是個錯誤。您遲早會遇到UTC問題,並且必須開始計算時間部分中具有00:00:00.000的日期的偏移量!

如果你只是存儲日期,我會堅持日期數據類型;您將每頁適合更多行併爲您節省大量麻煩

+0

這是一個也取決於「日期」的內容以及是否需要TZ意識(我的星期五可能不是你的星期五)。並不是說將所有內容存儲爲UTC要好得多......因爲它仍然不能捕獲TZ本身。還有一個'DATETIMEOFFSET'類型;但是,我不知道它是如何映射到.NET的: – 2012-04-13 16:41:43

+0

@ Click-Rex能否解釋你的上下文? – Pankaj 2012-04-13 16:42:41

+0

DateTime只是「本地時間」 - 它沒有時區表示的概念,這意味着你必須知道什麼時區是爲了讓你準確地解碼它所寫的時區,還有一些問題,比如夏令時埋在那裏,這就是關於UTC的評論 - 所有的應用程序都會將日期轉換爲UTC存儲,並返回到本地時間顯示,聽起來很容易嗎?不是真的 - 實際上很難讓所有的應用程序在沒有大量精力和測試的情況下做到這一點,DateTimeOffset類型是爲了試圖緩解這個問題而推出的 – stephbu 2012-04-13 16:47:57

1

取決於您要存儲的行數以及您使用的行數。日期是3個字節,日期時間是8個字節。當你擁有數十億行數據或者將它用於索引時,可以快速加起來。當然,存儲值的分辨率也有差異。日期和日期時間之間還有其他日期類型,例如smalldatetime,它們更加緊湊,並且具有不同的折衷。

SQL Date/Time Types Documentation

1

考慮:

  • 性能:日期型更少的位表示每個SQL頁更多的行(數據頁或索引頁)裝置少頁,以在執行讀取查詢
  • 兼容性:DATE類型在SQL Server 2008中引入,因此您的應用程序與SQL Server 2005不兼容
  • .NET:沒有Date類在.NET - DATE轉化爲DateTime .NET類
  • LINQ:LINQ2SQL(和SQL金屬工具)與DATE SQL類型
  • 你可能會突然小時和分鐘從DATETIME順利做CAST(@myDateTimeParam AS DATE)

從我的經驗:我喜歡這個新類型,也沒有與它的問題,而編程的T-SQL或C#

注意這一點(混合數據類型DAT E在特點比較):

DECLARE @startDay DATE = '2012-04-11' -- day 
DECLARE @endDay DATE = '2012-04-13' -- day 
DECLARE @eventTime DATETIME = '2012-04-13 12:00' -- point in time (noon) 

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!' 

結果是:

Not in period! 

BETWEEN特點比較@endDay澆鑄至DATETIME(在時間點;與@eventTime共同類型),我想 - 什麼給不直觀的結果。

比較:

DECLARE @startDay DATE = '2012-04-11' -- day 
DECLARE @endDay DATE = '2012-04-13' -- day 
DECLARE @eventTime DATE = '2012-04-13' -- day 

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!' 

結果:

In period. 

而且它:

DECLARE @startDay DATETIME = '2012-04-11' -- day, but point in time in fact 00:00.000 
DECLARE @endDay DATETIME = '2012-04-13' -- day, but point in time in fact 00:00.000 
DECLARE @eventTime DATETIME = '2012-04-13' -- day, but point in time in fact 00:00.000 

IF @eventTime BETWEEN @startDay AND @endDay PRINT 'In period.' ELSE PRINT 'Not in period!' 

結果:

In period.