SQL Server 2008 終于釋出新版了,雖然還隻是另一個社群測試版而非完全版。每當新軟體釋出,大家最關系的問得最多的問題就是:有些什麼新特性?SQL Server 2008有很多新功能和新工具。不過,本文還是主要為大家介紹SQL Server 2008七月預覽版引入的新資料類型,并對DATETIME資料類型的功能進行專門讨論。
SQL Server 2008中DATETIME功能的最大轉變就是引入了四種DATETIME資料類型,分别為DATE、TIME、DATETIMEOFFSET和DATETIME2;此外還增加了新的DATETIME函數功能。
下面首先來讨論一下四種新資料類型的功能和用法。
DATE資料類型
在SQL Server 2005中,沒有專門隻用來存儲日期(不包括時間)的特定資料類型,隻能使用DATETIME或SMALLDATETIME資料類型來完成此操作。但是,當你輸入日期之後,會顯示還有一個時間的組分需要輸入,其初始顯示為12:00 AM。如果隻想在輸出結果中顯示日期那一部分,就必須修改輸出格式。大部分情況下,可以使用getdate()函數來存儲目前日期。要在SQL Server 2005中的SMALLDATETIME或DATETIME列中儲存getdate()的函數值,同時也會儲存了目前的時間,而這可能會引發很多問題。舉例而言,如果你使用以下的語句,想根據給定的日期來搜尋記錄:
SELECT * FROM tblDate Where [Date] = '2007-12-01'
由于Date列裡含有時間組分,這個指令将無法正常執行, 是以,你必須執行以下的查詢操作:
SELECT * FROM tblDate Where datediff(d,[Date],‘2007-12-01’) =0
盡管上面的查詢操作可以行得通,不過Date列中符合要求的索引很可能不會被使用。不過你還是可以使用上面的查詢操作調出少量的記錄。雖然可以利用工作區,但很明顯有必要增加一種去掉時間值的DATE資料類型來減少潛在的錯誤。來看看以下的文法:
DECLARE @dt as DATE SET @dt = getdate() PRINT @dt |
以上腳本的輸出結果隻有日期,不包括時間部分。DATE資料類型的取值範圍從0001-01-01到9999-12-31。
TIME資料類型
就像日期資料類型一樣,如果你隻想存儲時間資料而不需要日期部分就可以利用TIME資料類型。下面就是利用TIME資料類型進行查詢的例子:
DECLARE @dt as TIME SET @dt = getdate() PRINT @dt |
以上腳本輸出結果隻包含時間部分,其取值範圍從00:00:00.0000000到23:59:59.9999999。
DATETIME2資料類型
新的DATETIME2資料類型也是一種資料時間混合的資料類型,不過其時間部分秒數的小數部分可以保留不同位數的值,比原來的DATETIME資料類型取值範圍要廣。使用者可以根據自己的需要通過設定不同的參數來,設定小數位數,最高可以設到小數點後七位(參數為7),也可以不要小數部分(參數為0),以此類推。以下是利用DATETIME2的查詢語句:
DECLARE @dt7 datetime2(7) SET @dt7 = Getdate() PRINT @dt7 --result is 2008-01-3 12:15:11.2340000 |
該語句的輸出結果中時間的秒數部分精确到小數點後第七位。具體參考如下:
Fraction | Output |
2007-10-28 22:11:20 | |
1 | 2007-10-28 22:11:19.7 |
2 | 2007-10-28 22:11:19.70 |
3 | 2007-10-28 22:11:19.703 |
4 | 2007-10-28 22:11:19.7030 |
5 | 2007-10-28 22:11:19.70300 |
6 | 2007-10-28 22:11:19.703000 |
7 | 2007-10-28 22:11:19.7030000 |
DATETIMEOFFSET資料類型
如果把日期和時間資料儲存在一列裡,是不會提示該日期和時間屬于哪一個時區的。時區的提示非常重要,特别是當你處理資料包含了多個不同時區的國家時。新的DATETIMEOFFSET資料類型可以定義一個日期和時間組合,其中時間以24小時制顯示,并帶有時區提示。下面的語句說明了DATETIMEOFFSET資料類型的用法:
DECLARE @dt DATETIMEOFFSET(0) SET @dt = '2007-12-04 21:20:30 -1:00' DECLARE @dt1 DATETIMEOFFSET(0) SET @dt1 = '2007-12-04 21:20:30 +5:00' SELECT DATEDIFF(hh,@dt,@Dt1) |
DateTime函數
目前我們可以在SQL Server 2005和SQL Server 2000中使用GETDATE函數來查詢目前的日期和時間。此外,在SQL Server 2005中,還有另外幾個類似的日期時間函數,分别為:CURRENT_TIMESTAMP、DATEADD、DATEDIFF、DATENAME、DATEPART、GETUTCDATE、DAY、 MONTH和YEAR。而在SQL Server 2008中,除了上述這些函數外,又新增了五個函數,分别為SYSDATETIME、SYSDATETIMEOFFSET、SYSUTCDATETIME、SWITCHOFFSET和TODATETIMEOFFSET。其中SYSDATETIME函數傳回目前系統的時間戳,不帶時區提示,能夠精确到毫秒級。SYSDATETIMEOFFSET函數和SYSDATETIME函數功能類似,不過包含了時區值。SYSUTCDATETIME傳回以世界标準時間(又稱協調世界時,也就是格林威治時間)表示的日期和時間,也精确到毫秒級,是根據目前SQL Server運作所在地伺服器所設定的本地時間和時區得來的。SYSDATETIME和SYSUTCDATETIME兩個函數傳回的都是DATETIME2資料類型,而SYSDATETIMEOFFSET函數傳回DATETIMEOFFSET資料類型。
SWITCHOFFSET函數
SWITCHOFFSET函數傳回DATETIMEOFFSET資料類型的值,不再根據存儲的時區偏移值取值,而是根據設定的新時區偏倚值來取值。看看下面這個語句:
SELECT SYSDATETIMEOFFSET(), SWITCHOFFSET (SYSDATETIMEOFFSET(), '-14:00')
該腳本傳回兩個列,第一列是根據世界标準時間得到的目前日期和時間值,第二列則是根據給定的時區偏移值傳回的日期時間值。
TODATETIMEOFFSET函數
TODATETIMEOFFSET函數可以把本地日期或時間值以及特定的時區偏移值轉變為一個datetimeoffset值。運作以下腳本,你會看到傳回的結果中除了目前日期和時間外,還增加了時區值。
SELECT TODATETIMEOFFSET (GETDATE(),'+11:00')
轉換函數
CONVERT函數可以從DATETIME資料類型的組成中抽取時間值或者日期值。運作以下腳本,傳回結果的第一列為目前日期,第二列為目前時間。
SELECT CONVERT(date, GETDATE()),CONVERT(time, GETDATE())
使用新DATETIME資料類型進行轉換的注意事項
如果你要增加DATE和TIME列,不能夠像SMALLDATETIME資料類型一樣加載,否則會傳回以下的錯誤資訊:Operand data type date is invalid for add operator。
你可以嘗試把這兩列設定為浮點型資料,一起存入,并把結果轉換成SMALLDATETIME或DATETIME列。(記住,當SMALLDATETIME資料存儲成浮點型時,日期值為整數部分而時間值為小數部分)不過,這也會傳回一個錯誤資訊:Explicit conversion from data type date to float is not allowed。
正确的做法是把兩列都轉換為SMALLDATETIME資料,并一起存入。例如使用以下腳本,你就可以得到輸出結果:
Declare @dt as DATE Set @dt = getdate() Declare @dtt as TIME Set @dtt = getdate() Select cast(@dt as smalldatetime) + cast(@dtt as smalldatetime) |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12641349/viewspace-145670/,如需轉載,請注明出處,否則将追究法律責任。
轉載于:http://blog.itpub.net/12641349/viewspace-145670/