摘要:SQL日期格式的選擇
SQL日期格式的選擇
關鍵字:sql server date datetime smalldatetime
可以找到約 112,000 筆資料。
系統單據一定都會記錄日期(但不一定包含時間)
所以如何選擇欄位屬性非常重要
前提是:
需不需要包含時間?
記錄的日期區間範圍到哪裡?
如果要包含時間有看過幾種格式,
datetime
從1753年1月1日到9999年12月31日的日期和時間數據,精確度為百分之三秒(等於3.33毫秒或0.00333秒)
雖然記錄到毫秒,但是只會顯示到秒
smalldatetime1900-2079(再66年 到民國168年)
雖然會表示到"秒",但實際上只記錄到分鐘
不包含時間有看過用INT記錄 e.g.20120101
int 4 個位元組
http://msdn.microsoft.com/zh-tw/library/ms187745.aspx
MSDN date 3個位元組(固定)
http://msdn.microsoft.com/zh-tw/library/bb630352.aspx
也許因為性能?
http://stackoverflow.com/questions/5622158/sql-server-date-vs-smalldatetime.
MSDN資料庫設計與效能 (SQL Server Compact)
http://msdn.microsoft.com/zh-tw/library/ms172432.aspx
MSDN區分
http://msdn.microsoft.com/en-us/library/aa258277(v=sql.80).aspx
接下來dateTime2加入戰局....
http://www.mssqltips.com/sqlservertip/1616/sql-server-2008-date-and-time-data-types/
資料類型 | 資料列壓縮時儲存是否受到影響? | 描述 | 位元組 | 日期區間範圍 |
smalldatetime | 否 | 藉由使用兩個 2 位元組整數來使用整數資料表示。日期會使用 2 個位元組,是 1901 年 1 月 1 日之後的日數。這需要 2 個位元組,從 1902 開始;因此在該時間點後就無法進行節省。 | 4 個位元組 (固定) | 西元1900年1月1日到2079年6月6日 |
時間是午夜之後的分鐘數。稍微超過 4AM 的時間值會開始使用第二個位元組。 | ||||
如果 smalldatetime 只會用來表示日期 (常見的情況),則時間是 0.0。壓縮會針對資料列壓縮以最大顯著性位元組格式儲存時間而節省 2 個位元組。 | ||||
datetime | 是 | 藉由使用兩個 4 位元組整數來使用整數資料表示。整數值代表日數,基底日期則是 1900 年 1 月 1 日。第一個 2 位元組最多可代表到 2079 年。在該時間點之前,此處的壓縮一定可以節省 2 個位元組。每個整數值都代表 3.33 毫秒。壓縮在第一個五分鐘內就會用盡第一個 2 個位元組,而需要在 4PM 之後使用第四個位元組。因此,在 4PM 之後僅能節省 1 個位元組。當 datetime 像任何其他整數一樣進行壓縮時,壓縮可以在日期中節省 2 個位元組。 | 8 位元組 | 西元1753年1月1日到9999年12月31日 |
date | 否 | 藉由使用 3 個位元組來使用整數資料表示。這代表從 0001 年 1 月 1 日開始的日期。對於現代的日期而言,資料列壓縮會使用所有 3 個位元組。如此不會達成任何節省量。 | 3個位元組(固定) | 西元1年1月1日 到西元 9999 年 12 月 31 日 |
datetime2 | 是 | 藉由使用 6 到 9 個位元組來使用整數資料表示。第一個 4 位元組代表日期。由時間所使用的位元組會依所指定時間的有效位數而定。 | 6 個位元組代表有效位數小於 3,而 7 個位元組則代表有效位數是 3 和 4。 所有其他有效位數則需要 8 個位元組。 | 西元 1 年 1 月 1 日到西元 9999 年 12 月 31 日 |
整數值代表自 0001 年 1 月 1 日開始的日數,上限則是 9999 年 12 月 31 日。為了代表 2005 年中的日期,壓縮會使用 3 個位元組。 | ||||
不會節省任何時間,因為它針對不同的時間有效位數而允許 2 到 4 個位元組。因此,對於一秒鐘的時間有效位數而言,壓縮會為時間使用 2 個位元組,而在 255 秒之後使用第二個位元組。 |
MSDN資料列壓縮實作
http://msdn.microsoft.com/zh-tw/library/cc280576(v=sql.100).aspx
資料庫系統調校是一件很複雜的事情
MSDN資料庫設計與效能
http://msdn.microsoft.com/zh-tw/library/ms172432.aspx
使用資料庫非正規化
在可變長度資料行與固定長度資料行之間選擇
建立較小資料列長度
使用較小索引鍵長度
所以包含時間的型態就選用datetime2
只有日期的型態就選擇date!!!