你是否曾經想在數據庫中存儲一個日期而沒有時間部分,或者想存儲一個時間值希望有更高的精度?在SQL Server 2008的介紹中,微軟介紹了一些新的日期數據類允許你只存儲一個日期、更高精度的時間值等。這些新的數據類型為你存儲日期和時間相關信息提供了一些附加選項。在本篇文章中,我將介紹這些新的日期數據類型以及與舊版本的SQL Server中現有的數據類型進行比較。
回顧舊的日期數據類型
在我們開始討論SQL Server 2008中新的日期數據類型之前,先來回顧一下SQL Server 2005中以及更老版本中提供的兩種日期數據類型,這些舊的數據類型是DATETIME和SMALLDATETIME,這兩個數據類型在SQL Server 2008中仍然可以使用。
DATETIME數據類型存儲把日期和時間部分作為一個單列值在一起存儲,該數據類型支持日期從1753年1月1日到9999年12月31日,時間部分的精確度是3.33毫秒,它需要8字節的存儲空間。SMALLDATETIME數據類型比起DATETIME類型來說需要更少的存儲空間,只有4字節,但是支持更小的日期和時間范圍。SMALLDATETIME只支持日期從1900年1月1日到2079年6月6日,時間部分只能夠精確到分鐘。
這兩種有限的日期格式限制了你在存儲更早日期以及更高精度的時間時的選擇,它們的不足之處使得難以從其它支持不同日期和時間范圍的數據結構進行數據遷移,與SQL Server 2008中新的日期數據類型相比,在存儲日期和時間時有了更多的選擇。
DATITIME2
DATETIME2數據類型是對DATETIME數據類型的一個擴展,該新的數據類型擴展了可以接受日期的范圍和在日期/時間值的時間部分添加附加精度。DATETIME2列支持日期從0001-01-01到9999-01-01。擴大的日期范圍現在允許你存儲更早的日期而無需使用一些創造性的編碼算法。
DATETIME2中的時間部分的精確度依賴於你如何定義DATETIME2列,時間部分能夠存儲一個只有小時、分鐘和秒的時間值,或者它能夠支持在不同的精確定存儲微秒,最多有7位小數,微妙可以向下精確到100納秒。
使用DATETIME2數據類型你可以使用不同的長度字符存儲和顯示日期,從19(YYYY-MM-DD hh:mm:ss)到27(YYYY-MM-DD hh:mm:ss.0000000)。這依賴於不同數量的精度存儲需要一定的磁盤開銷。在DATETIME2列中存儲不同的精度時需要在定義列時指定一個長度,我們可以像DATETIME2(X)來指定精度,其中X代表的是精度長度,可以從0到7。顯示長度和存儲空間的關系如下表所示:
圖1
正如上表所示,DATETIME2列存儲一個日期/時間值的磁盤空間開銷是從6-8字節,它取決於你想要保留多少時間精度。
DATETIME2(3)格式等同於我們在舊版本的SQL Server中使用的DATETIME格式,但是使用DATETIME2(3)可以支持精確度到1毫秒,而舊版本中的DATETIME格式只能精確到3.33毫秒。注意DATETIME2(3)只需要7字節的磁盤開銷,而DATETIME格式需要8個字節,現在,這意味著你可以存儲與較早發布的SQL Server相同的日期和時間值並且能夠節省磁盤空間。
使用DATETIME(7)格式允許你存儲日期類型向上精確到100納秒,盡管增加了精度,但是你不能保證在一張表中的一個時間值是唯一的,當使用DATETIME(7)格式時仍然可能在同一張表中存儲兩條具有相同時間的不同的記錄。