T-SQL Programming 1:DateTime Datatype part1

來源:互聯網
上載者:User

DateTime 是使用最多和出現問題最多的資料類型之一。主要存在以下問題:

一、DateTime儲存格式

在講解DateTime儲存格式之前,需要糾正一個概念。組成DateTime類型的各個部分:year ,Month,day,hour,minute,second,millisecond,不是隔離儲存區 (Isolated Storage)。相反,DateTime作為整體,用兩個4byte整數儲存。

一個單獨的DateTime類型需要 8byte儲存,前4個byte儲存 1900-1-1之前或者之後的日期資訊。 後4個byte儲存 一天內的時間資訊,Datetime 中的時間可以精確到1/3 millisecond。DateTime類型支援的資料範圍是:1753年1月1日 至 9999年12月31日。為什麼是1753年呢?從技術角度完全可以支援更早的日期。1753年的限制主要是從Julian到格林尼治時間的轉換。

SmallDateTime類型使用 4byte 類型的,前兩個byte儲存從1900年1月1日至今的日期,後兩個byte 可以精確到minute 儲存時間資訊。SmallDateTime 類型表示的資料範圍為:1900-1-1至 2079-6-1.

二、如何使用DateTime

DateTime的使用是比較複雜的一件事情。如何正確的表示 日期呢? 當輸入如“20060611 23:59:59:59:999”這樣一個不能精確表示的內容時,會發生什麼呢?怎樣將日期和時間分開呢?接下來將會對這些問題進行討論。

1.Literals

在T-SQL中表示一個DateTime內容的輸入,是一件非常tricky不知道怎麼翻譯)的事情。在一個需要DateTime類型的Insert 或者Update語句中,輸入一個字串表示日期內容時,資料庫系統會隱式完成資料類型之間的轉換。當然,當存在多個運算元時,操作直接的優先順序取決於運算元的資料類型。DateTime類型的優先順序要高於String類型。當DateTime類型資料和Stirng類型資料進行比較時,String類型隱式轉換為DateTime類型。

在表示DateTime類型資料時,存在著不同的轉換,這樣增加了事情的複雜性。例如:“02/12/06” 對於不同的人有不同的含義。在將此字串轉換為DateTime類型時,SQL Server會根據 會話的語言設定langeage settings of session)進行相應的轉換。會話語言取決於登陸賬者的預設語言。但此設定可以通過Set Language選項進行修改。我們也可以通過設定Set Date-Format選項,控制DateTime如何轉換。Set Language選項會隱式設定Date-Format 符合語言習慣。 

例來自Microsoft msdn):

 
  1. Declare @today varchar(10)  
  2. set @today='12/3/2007' 
  3. set language italian  
  4. select datename(month,@today) as 'month name' 
  5. set language us_english  
  6. select datename(month,@today) as 'month name' 
  7. go  
  8. output :   
  9.   month name              
  10. 1.  marzo  
  11.   month name 
  12. 1.  December  
  13.  

雖然,我們可以通過Set 選項控制DateTime類型資料的轉換,但是,我們需要注意到,Set 選項會修改整個會話的語言設定。那麼,會話中依賴預設語言設定的代碼,在Set language操作後,將會怎麼樣呢?在國際應用中,關於這方面的考慮是非常重要的。

因此,在編寫代碼時,我儘可能的書寫不依賴系統設定和轉換的代碼。在SQL Server中,DateTime有兩種格式,不依賴於系統設定。我比較傾向於在各個日期部分之間沒有分隔字元的格式,如“[yy]yymmdd [hh:mi:[ss][.mmm]]”,具體的資料如“20060312” ,“060312”,“20060312 23.59.59.999”等等。DateFormat 和language設定不會影響此種格式的字串。如果需要在年份,月份等之間顯示分隔字元,建議使用以下格式“yyyy-mm-ddT hh:mi:dd[.mmm]”,具體的資料如:“2006-03-12T 14:23:05”。注,“yyyy-mm-ddT hh:mi:dd[.mmm]”格式測試下來還是依賴語言設定,不知道是否是我做的不對.)

除Set選項外,我們還可以使用Convert 方法顯示轉換 DateTime資料為不同的格式。如Convertdatetime,'12/02/2006',3).返回結果“2006-02-12 00:00:00.000”.

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.