2011年3月22日 星期二

字母日期格式的問題

  最近剛好在看這篇Fight Your Fear for Date Calculations,裡面有提到這種"2010 Jan"字母日期,我想說要解這種問題,首先要讓SQL Server可以辨識這樣的日期格式,由於之前沒碰過這種格式,於是去BOL字母日期格式查看,發現SQL Server本身就可以辨識下面這些格式了 (括在方括號中的字元是選擇性的)
Apr[il] [15][,] 1996
[15] Apr[il][,] 1996 
1996 APR[IL] [15]
1996 [15] APR[IL]

  那我試下面的T-SQL,看到底能不能正確轉換
  select cast('1996 APRIL 15' as datetime)

  結果出錯,是怎樣,BOL有錯嗎?

訊息241,層級16,狀態1,行1
從字元字串轉換到datetime 時,轉換失敗。
  我試了BOL所列的所有格式,結果都不行,於是再上網找答案,終於在使用日期和時間資料找到相關解答了,截取如下

  SQL Server 會在執行階段計算 datetime 常數。如果透過連接執行查詢,而連接是使用不同的語言與日期格式設定,那麼原先在另一種語言中日期格式有效的日期字串可能會變成無法辨識。例如,此檢視在語言設成美式英文的連接上可以正常執行,但連接如果使用其他語言設定就無法辨識

  意思就是工作階段的語言決定了datetime格式,語言設錯就會辨識不了,查一下sys.syslanguages就能比較了解喔
  
  你看繁體中文對應的月份為一月,二月,而us_english對應的為January,February,所以要解決"2010 Jan"這種的,工作階段的語言要設為us_english即可,多加一行就OK
set language us_english
select cast('1996 APRIL 15' as datetime)

0 意見:

張貼留言