2014年1月6日 星期一

T-SQL 日期格式轉換成文字

每次到了要轉換日期格式的時候都會特別想念 Oracle ,只要下 to_char(date, format) 指令就可以輕鬆完成日期轉成文字
但沒辦法,手上的專案就是使用 SQL Server ,該來的還是躲不掉,只是每次都會忘,忘了就要查 Google ,

Will 大的這一篇寫得非常完整,就拿來引用
http://blog.miniasp.com/post/2008/02/27/Use-CONVERT-function-to-deal-with-SQL-Server-Datetime.aspx

摘錄其範例如下:
輸出格式:2008-02-27 00:25:13
SELECT CONVERT(char(19), getdate(), 120)

輸出格式:2008-02-27
SELECT CONVERT(char(10), getdate(), 20)

輸出格式:2008.02.27
SELECT CONVERT(char(10), getdate(), 102)

輸出格式:08.02.27
SELECT CONVERT(char(8), getdate(), 2)

輸出格式:2008/02/27
SELECT CONVERT(char(10), getdate(), 111)

輸出格式:08/02/27
SELECT CONVERT(char(8), getdate(), 11)

輸出格式:20080227
SELECT CONVERT(char(8), getdate(), 112)

輸出格式:080227
SELECT CONVERT(char(6), getdate(), 12)


以下摘錄 MSDN 的樣式說明
http://msdn.microsoft.com/zh-tw/library/ms187928.aspx


日期和時間樣式

當 expression 是日期或時間資料類型時, style 就可以是下表所列的其中一個值。 其他值則當做 0 處理。 從 SQL Server 2012 開始,當從日期和時間類型轉換為datetimeoffset 時,唯一支援的樣式為 0 或 1。 所有其他轉換樣式都會傳回錯誤 9809。
SQL Server 利用科威特演算法來支援阿拉伯文樣式的日期格式。
不含世紀 (yy) (1)
含世紀 (yyyy)
標準
輸入/輸出 (3)
-
0 或 100 (1,2)
預設
mon dd yyyy hh:miAM (或 PM)
1
101
美式英文
1 = mm/dd/yy
101 = mm/dd/yyyy
2
102
ANSI
2 = yy.mm.dd
102 = yyyy.mm.dd
3
103
英式英文/法文
3 = dd/mm/yy
103 = dd/mm/yyyy
4
104
德文
4 = dd.mm.yy
104 = dd.mm.yyyy
5
105
義大利文
5 = dd-mm-yy
105 = dd-mm-yyyy
6
106 (1)
-
6 = dd mon yy
106 = dd mon yyyy
7
107 (1)
-
7 = Mon dd, yy
107 = Mon dd, yyyy
8
108
-
hh:mi:ss
-
9 或 109 (1,2)
預設值 + 毫秒
mon dd yyyy hh:mi:ss:mmmAM (或 PM)
10
110
美國
10 = mm-dd-yy
110 = mm-dd-yyyy
11
111
日本
11 = yy/mm/dd
111 = yyyy/mm/dd
12
112
ISO
12 = yymmdd
112 = yyyymmdd
-
13 或 113(12)
歐洲預設值 + 毫秒
dd mon yyyy hh:mi:ss:mmm(24h)
14
114
-
hh:mi:ss:mmm(24h)
-
20 或 120 (2)
ODBC 標準
yyyy-mm-dd hh:mi:ss(24h)
-
21 或 121 (2)
ODBC 標準 (含毫秒)
yyyy-mm-dd hh:mi:ss.mmm(24h)
-
126 (4)
ISO8601
yyyy-mm-ddThh:mi:ss.mmm (無空格)
附註 附註
如果毫秒 (mmm) 的值為 0,將不會顯示毫秒值。 例如,'2012-11-07T18:26:20.000' 值會顯示為 '2012-11-07T18:26:20'。
-
127(6, 7)
具有時區 Z 的 ISO8601。
yyyy-mm-ddThh:mi:ss.mmmZ (無空格)
附註 附註
如果毫秒 (mmm) 的值為 0,將不會顯示毫秒值。 例如,'2012-11-07T18:26:20.000' 值會顯示為 '2012-11-07T18:26:20'。
-
130 (1,2)
回曆 (5)
dd mon yyyy hh:mi:ss:mmmAM
在此樣式中,mon 代表完整月份名稱的多 Token 回曆 unicode 表示法。 這個值無法在預設 SSMS 美國安裝中正確呈現。
-
131 (2)
回曆 (5)
dd/mm/yyyy hh:mi:ss:mmmAM
1 這些樣式值會傳回不具決定性的結果。 其中包括所有 (yy) (不含世紀) 樣式和 (yyyy) (含世紀) 樣式的子集。
2 預設值 (style0 或 1009 或 10913 或 11320 或 120 及 21 或 121) 一律會傳回世紀 (yyyy)。
3 當轉換成 datetime 時輸入;當轉換成字元資料時輸出。
4 專為了 XML 而設計。 如果是從 datetime 或 smalldatetime 轉換成字元資料,輸出格式會符合上表的描述。
5 回曆是有多種變化的日曆系統 SQL Server 使用科威特演算法。
重要事項 重要事項
根據預設,SQL Server 會根據截止年份 2049 來解譯兩位數的年份。 也就是說,兩位數年份 49 會解譯為 2049,而兩位數年份 50 會解譯成 1950。 許多用戶端應用程式 (例如根據 Automation 物件的應用程式) 都使用截止年份 2030 年。 SQL Server 提供的 two digit year cutoff 組態選項會變更 SQL Server 所使用的截止年份,並允許以一致方式處理日期。 我們建議您指定四位數的年份。
6 只有在從字元資料轉換為 datetime 或 smalldatetime 時才支援。 當只代表日期或只代表時間元件的字元資料轉換為 datetime 或 smalldatetime 資料類型時,未指定的時間元件會設定為 00:00:00.000,而未指定的日期元件則會設定為 1900-01-01。
7 選擇性的時區指標 Z 可用來輕鬆地將具有時區資訊的 XML datetime 值對應到沒有時區的 SQL Server datetime 值。 Z 是時區 UTC - 0 的指標。 其他的時區是以 + 或 - 方向位移的 HH:MM 來代表。 例如:2006-12-12T23:45:12-08:00
當您從 smalldatetime 轉換成字元資料時,包括秒或毫秒的樣式會在這些位置顯示零。 當您從 datetime 或 smalldatetime 值轉換時,您可以利用適當的 char 或 varchar資料類型長度來截斷不需要的日期部分。
當您從含有時間之樣式的字元資料轉換成 datetimeoffset 時,時區時差就會附加至結果。