SQL Server 2008對日期時間類型的改進
微軟在備受多年的爭議后,終于對日期時間數據類型開刀了,在新版的SQL Server 2008中一口氣增加了4種新的日期時間數據類型,包括:
- Date:一個純的日期數據類型。
- Time:一個純的時間數據類型。
- DateTime2:新的日期時間類型,將精度提到到了100納秒。
- DateTimeOffset:新的日期時間類型,在DateTime2的基礎上增加了時區部分。
下面是在SQL Server 2008中日期時間數據類型的一個簡單匯總表:
| 數據類型 | 格式 | 取值范圍 | 精度 | 存儲尺寸 |
| date | yyyy-mm-dd | 0001-1-1 9999-12-31 | 1天 | 3字節 |
| time | hh:mm:ss.nnnnnn | 0:0:0.000000 23:59:59.999999 | 100納秒 | 3-5字節 |
| smalldatetime | yyyy-mm-dd hh:mm:ss | 1900-1-1 2079-6-6 | 1分鐘 | 4字節 |
| datetime | yyyy-mm-dd hh:mm:ss:nnn | 1753-1-1 9999-12-31 | 0.00333秒 | 8字節 |
| datetime2 | yyyy-mm-dd hh:mm:ss:nnnnnn | 0001-1-1 9999-12-31 | 100納秒 | 6-8字節 |
| datetimeoffset | yyyy-mm-dd hh:mm:ss:nnnnnn +|- hh:mm | 0001-1-1 9999-12-31 (全球標準時間) | 100納秒 | 8-10字節 |
為了使用這些數據類型,SQL Server 2008同時還引入了一系列的T-SQL函數。
三個用于獲得高精度系統時間的函數(因為是這三個函數都是取的操作系統時間,所以精度僅能達到10毫秒):
- SYSDATETIME:返回運行SQL Server實例的服務器的本地時間,數據類型是datetime2(7),不包含時區信息。
- SYSDATETIMEOFFSET:返回運行SQL Server實例的服務器的本地時間及時區信息,數據類型是datetimeoffset(7)。
- SYSUTCDATETIME:返回運行SQL Server實例的服務器的標準世界時間,數據類型是datetime2(7)。
用于時區轉換的函數:
- SWITCHOFFSET(datetimeoffset, time_zone):根據輸入的世界時間以及時區信息返回某個特定時區的數據,例如SWITCHOFFSET('2008-1-1 0:0:0 + 8:00', '-07:00')返回值將是'2007-12-31 9:00 -07:00',這樣我們就曉得我們元旦的時候老美的時間只是早上9:00。(有個有趣的情況是SWITCHOFFSET函數time_zone參數小時的前導0時不能省略的,就我們剛才用的那個例子如果time_zone參數寫成'7:00'就會報錯,必須寫成'07:00',不過datetimeoffset數據里那個時區部分小時的前導0時可以省略的,也就是說'2008-1-1 0:0:0 + 8:00'和'2008-1-1 0:0:0 + 08:00'都是可以接受的,對于時區中分鐘部分也是如此。不過建議大家養成良好的編碼習慣,所有前導0都不要省略。)
- TODATETIMEOFFSET(datetime, offset):根據輸入的日期時間參數值和時區參數值返回一個世界時間值。例如TODATETIMEOFFSET('2008-1-1 0:0:0', '+08:00')返回值是'2008-1-1 0:0:0 + 08:00'。
順便列舉一下SQL Server 2005中已經提供的日期時間函數,不過就不做介紹了:
- 用于獲取系統時間的函數:CURRENT_TIMESTAMP,GETDATE,GETUTCDATE
- 返回日期時間的指定部分:DATENAME,DATEPART,DAY,MONTH,YEAR
- 計算日期時間差異的函數:DATEDIFF, DATEADD (必須注意的是datetime、smalldatetime數據類型支持+和-運算符,但是對于date、time、datetime2、datetimeoffset則不支持。)
- 對日期時間進行計算的函數:DATEADD
- 設置日期時間顯示格式的函數:@@DATEFIRST,SET DATEFIRST,SET DATEFORMAT,@@LANGUAGE,SET LANGUAGE,sp_helplanguage
- 用于確認日期時間數據格式的函數:ISDATE
浙公網安備 33010602011771號