SQL2008 的 日期數據類型


摘要

你是否曾經想在數據庫中存儲一個日期而沒有時間部分,或者想存儲一個時間值希望有更高的精度?在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。顯示長度和存儲空間的關系如下表所示:

TerryLee_0001

正如上表所示,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)格式時仍然可能在同一張表中存儲兩條具有相同時間的不同的記錄。

此處是一個如何使用DATETIME2不同的精度值來顯示不同的時間格式:

DECLARE @D0 datetime2(0) = '2008-05-10 06:59:11.1234567';
DECLARE @D1 datetime2(1) = '2008-05-10 06:59:11.1234567';
DECLARE @D2 datetime2(2) = '2008-05-10 06:59:11.1234567';
DECLARE @D3 datetime2(3) = '2008-05-10 06:59:11.1234567';
DECLARE @D4 datetime2(4) = '2008-05-10 06:59:11.1234567';
DECLARE @D5 datetime2(5) = '2008-05-10 06:59:11.1234567';
DECLARE @D6 datetime2(6) = '2008-05-10 06:59:11.1234567';
DECLARE @D7 datetime2(7) = '2008-05-10 06:59:11.1234567';
PRINT @D0;
PRINT @D1;
PRINT @D2;
PRINT @D3;
PRINT @D4;
PRINT @D5;
PRINT @D6;
PRINT @D7;

當運行上述代碼時將會得到如下結果:

2008-05-10 06:59:11
2008-05-10 06:59:11.1
2008-05-10 06:59:11.12
2008-05-10 06:59:11.123
2008-05-10 06:59:11.1235
2008-05-10 06:59:11.12346
2008-05-10 06:59:11.123457
2008-05-10 06:59:11.1234567

此處你可以看到,不同數量的精度顯示不同的微秒,注意當我在DECLARE語句中設置默認值時DATETIME(4), DATETIME(5) 和DATETIME(6)做了一些舍入。

使用DATETIME2現在可以讓你存在日期和時間在一列時有了更多的選擇,現在如果你只想存儲一個日期和精確到秒的時間,你可以使用DATETIME(0)來完成此需求而無需編寫額外的代碼以及浪費昂貴的磁盤開銷。

DATE

你是否曾經想只存儲日期而沒有時間?如果是的話,使用舊的日期數據類型將無法完成。現在在SQL Server 2008中你可以使用DATE數據類型,DATE數據類型允許只存儲一個日期值,它支持的日期范圍從0001-01-01到9999-12-31,存儲DATE數據類型磁盤開銷只需3個字節,如果你只需要存儲日期值而沒有時間,使用DATE可以比SMALLDATETIME節省一字節的磁盤空間。

這里用一個示例來展示如何顯示DATE的值

SET NOCOUNT ON;
DECLARE @D DATE = '2001-03-1';
PRINT @D;
SELECT CONVERT(char(10),@D,120) DATEONLY, @D [DATE-N-TIME];

運行上述代碼將會得到如下結果

2001-03-01
DATEONLY   DATE-N-TIME
---------- -----------------------
2001-03-01 2001-03-01 00:00:00.000

這里你可以看到PRINT語句顯示日期使用YYYY-MM-DD格式,但是SELECT語句要求你使用CONVERT函數把DATE變量轉換為YYYY-MM-DD格式,正如你所看到的,如果你使用SELECT只顯示一個DATE變量,最后的輸出結果仍然包含時間部分,這個功能在所有新的日期和時間數據類型中是一致的。

TIME

SQL Server 2008現在有了一個TIME數據類型,它允許你只存儲一個時間值而沒有時間。如果想要存儲一個特定的時間信息而不涉及具體的日期時,這將非常的有用。TIME數據類型存儲使用24小時制,它並不關心時區,支持高達100納秒的精確度。TIME數據類型支持從0到7不同的精度,就像DATETIME2格式,它的磁盤開銷是3到5個字節,取決與精度。TIME列的長度與精度如下表所示:

TerryLee_0002

此處是一個如何使用不同的DATETIME2精度值來顯示不同的時間格式的示例:

DECLARE @T0 time(0) = '16:59:11.1234567';
DECLARE @T1 time(1) = '16:59:11.1234567';
DECLARE @T2 time(2) = '16:59:11.1234567';
DECLARE @T3 time(3) = '16:59:11.1234567';
DECLARE @T4 time(4) = '16:59:11.1234567';
DECLARE @T5 time(5) = '16:59:11.1234567';
DECLARE @T6 time(6) = '16:59:11.1234567';
DECLARE @T7 time(7) = '16:59:11.1234567';
PRINT @T0;  
PRINT @T1;  
PRINT @T2;  
PRINT @T3;  
PRINT @T4;  
PRINT @T5;  
PRINT @T6;  
PRINT @T7;

當運行上述代碼時將會得到如下結果:

16:59:11
16:59:11.1
16:59:11.12
16:59:11.123
16:59:11.1235
16:59:11.12346
16:59:11.123457
16:59:11.1234567

注意TIME(4),TIME(5)和TIME(6)在顯示時進行了精度截斷,這與我們前面看到的DATETIME2的行為是一致的。只存儲時間部分的TIME數據類型列現在允許我們驗證SQL Server的時間值以確保它們包含的是有效的時間,並且能夠節省空間。

DATETIMEOFFSET

最后新的日期數據類型是DATETIMEOFFSET數據類型,此數據類型讓你存儲的日期和時間(24小時制)是時區一致的。時間部分能夠支持如DATETIME2和TIME數據類型那樣的高達100納秒的精度。DATETIMEOFFSET需要8到10字節的磁盤空間開銷,這完全取決於你定義的時間部分的精度,如下表所示:

TerryLee_0003

時區一致是指時區標識符是存儲在DATETIMEOFFSET列上,時區標識是代表了一個[-|+]hh:mm指定,一個有效的時區范圍是從-14:00到+14:00,這個值是增加或者減去UTC以獲取本地時間。如需有關時間的轉換,請參見“使用日期和時間”主題在聯機叢書。

總結

使用SQL Server 2008,現在有了更多的數據類型選擇,可以用來存儲你的日期和時間數據。你可以使用DATE數據類型只存儲一個日期,或者TIME數據類型只存儲一個時間值。在這些新的數據類型中時間部分現在支持的精度可以達到100納秒。如果有需要存儲日期需要與SQL Server的時區保持一致,可以使用DATETIMEOFFSET數據類型,有了這些新的日期/時間數據類型,你應該能夠找到好的解決方案,以幫助你存儲你的日期使用正確的格式而不需要寫大量的自定義代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM