SQL Server 2008中的新日期數(shù)據(jù)類型_Mssql數(shù)據(jù)庫教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:怎樣使用SQLServer數(shù)據(jù)庫查詢累計值
      有這樣一個要求,它要創(chuàng)建一個SQL Server查詢,其中包括基于事件時刻的累計值。典型的例子就是一個銀行賬戶,因為你每一次都是在不同的時間去存錢和取錢。對任意一個賬戶來說,在某個時間點都要算出它的借(存款)和貸(取款)之和。每一筆交易之后,你都想

      你是否曾經(jīng)想在數(shù)據(jù)庫中存儲一個日期而沒有時間部分,或者想存儲一個時間值希望有更高的精度?在SQL Server 2008的介紹中,微軟介紹了一些新的日期數(shù)據(jù)類允許你只存儲一個日期、更高精度的時間值等。這些新的數(shù)據(jù)類型為你存儲日期和時間相關(guān)信息提供了一些附加選項。在本篇文章中,我將介紹這些新的日期數(shù)據(jù)類型以及與舊版本的SQL Server中現(xiàn)有的數(shù)據(jù)類型進行比較。

      回顧舊的日期數(shù)據(jù)類型

      在我們開始討論SQL Server 2008中新的日期數(shù)據(jù)類型之前,先來回顧一下SQL Server 2005中以及更老版本中提供的兩種日期數(shù)據(jù)類型,這些舊的數(shù)據(jù)類型是DATETIME和SMALLDATETIME,這兩個數(shù)據(jù)類型在SQL Server 2008中仍然可以使用。

      DATETIME數(shù)據(jù)類型存儲把日期和時間部分作為一個單列值在一起存儲,該數(shù)據(jù)類型支持日期從1753年1月1日到9999年12月31日,時間部分的精確度是3.33毫秒,它需要8字節(jié)的存儲空間。SMALLDATETIME數(shù)據(jù)類型比起DATETIME類型來說需要更少的存儲空間,只有4字節(jié),但是支持更小的日期和時間范圍。SMALLDATETIME只支持日期從1900年1月1日到2079年6月6日,時間部分只能夠精確到分鐘。

      這兩種有限的日期格式限制了你在存儲更早日期以及更高精度的時間時的選擇,它們的不足之處使得難以從其它支持不同日期和時間范圍的數(shù)據(jù)結(jié)構(gòu)進行數(shù)據(jù)遷移,與SQL Server 2008中新的日期數(shù)據(jù)類型相比,在存儲日期和時間時有了更多的選擇。

      DATITIME2

      DATETIME2數(shù)據(jù)類型是對DATETIME數(shù)據(jù)類型的一個擴展,該新的數(shù)據(jù)類型擴展了可以接受日期的范圍和在日期/時間值的時間部分添加附加精度。DATETIME2列支持日期從0001-01-01到9999-01-01。擴大的日期范圍現(xiàn)在允許你存儲更早的日期而無需使用一些創(chuàng)造性的編碼算法。

      DATETIME2中的時間部分的精確度依賴于你如何定義DATETIME2列,時間部分能夠存儲一個只有小時、分鐘和秒的時間值,或者它能夠支持在不同的精確定存儲微秒,最多有7位小數(shù),微妙可以向下精確到100納秒。

      使用DATETIME2數(shù)據(jù)類型你可以使用不同的長度字符存儲和顯示日期,從19(YYYY-MM-DD hh:mm:ss)到27(YYYY-MM-DD hh:mm:ss.0000000)。這依賴于不同數(shù)量的精度存儲需要一定的磁盤開銷。在DATETIME2列中存儲不同的精度時需要在定義列時指定一個長度,我們可以像DATETIME2(X)來指定精度,其中X代表的是精度長度,可以從0到7。顯示長度和存儲空間的關(guān)系如下表所示:

      TerryLee_0001

      圖1

      正如上表所示,DATETIME2列存儲一個日期/時間值的磁盤空間開銷是從6-8字節(jié),它取決于你想要保留多少時間精度。

      DATETIME2(3)格式等同于我們在舊版本的SQL Server中使用的DATETIME格式,但是使用DATETIME2(3)可以支持精確度到1毫秒,而舊版本中的DATETIME格式只能精確到3.33毫秒。注意DATETIME2(3)只需要7字節(jié)的磁盤開銷,而DATETIME格式需要8個字節(jié),現(xiàn)在,這意味著你可以存儲與較早發(fā)布的SQL Server相同的日期和時間值并且能夠節(jié)省磁盤空間。

      使用DATETIME(7)格式允許你存儲日期類型向上精確到100納秒,盡管增加了精度,但是你不能保證在一張表中的一個時間值是唯一的,當(dāng)使用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;

      當(dāng)運行上述代碼時將會得到如下結(jié)果:

      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

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

      使用DATETIME2現(xiàn)在可以讓你存在日期和時間在一列時有了更多的選擇,現(xiàn)在如果你只想存儲一個日期和精確到秒的時間,你可以使用DATETIME(0)來完成此需求而無需編寫額外的代碼以及浪費昂貴的磁盤開銷。
      你是否曾經(jīng)想只存儲日期而沒有時間?如果是的話,使用舊的日期數(shù)據(jù)類型將無法完成。現(xiàn)在在SQL Server 2008中你可以使用DATE數(shù)據(jù)類型,DATE數(shù)據(jù)類型允許只存儲一個日期值,它支持的日期范圍從0001-01-01到9999-12-31,存儲DATE數(shù)據(jù)類型磁盤開銷只需3個字節(jié),如果你只需要存儲日期值而沒有時間,使用DATE可以比SMALLDATETIME節(jié)省一字節(jié)的磁盤空間。
      這里用一個示例來展示如何顯示DATE的值
      SET NOCOUNT ON; DECLARE @D DATE = '2001-03-1'; PRINT @D; SELECT CONVERT(char(10),@D,120) DATEONLY, @D [DATE-N-TIME];


      運行上述代碼將會得到如下結(jié)果:
      2001-03-01 DATEONLY DATE-N-TIME ---------- ----------------------- 2001-03-01 2001-03-01 00:00:00.000

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

      TIME

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

      TerryLee_0002

      圖1

      此處是一個如何使用不同的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;

      當(dāng)運行上述代碼時將會得到如下結(jié)果:

      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數(shù)據(jù)類型列現(xiàn)在允許我們驗證SQL Server的時間值以確保它們包含的是有效的時間,并且能夠節(jié)省空間。
      DATETIMEOFFSET

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

      TerryLee_0003

      圖1

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

      More Date and Time Choices

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

      分享:微軟已證實最新的關(guān)鍵SQL Server漏洞
      微軟在12月22日早上發(fā)布新的安全通告證實,一處遠程執(zhí)行代碼漏洞影響到了整個SQL Server產(chǎn)品線。 該漏洞的入侵代碼在兩周前已經(jīng)被公布在互聯(lián)網(wǎng)上,微軟在安全通告上稱,該漏洞尚未影響到Microsoft SQL Server 7.0 SP4, Microsoft SQL Server 2005 SP3,和 Mic

      來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2009-05-15
      相關(guān)Mssql數(shù)據(jù)庫教程