2012-01-04 89 views
1

運行:SQL轉換忽略格式?

SELECT CONVERT(VARCHAR(20), GETDATE(), 100) 

將導致:

Jan 4 2012 1:25PM 

我一直都知道這幾年。

然而,昨天,當我開車,我認爲我自己:

嘿!我給他的格式爲103這是日期時間格式,

但我沒有實際TOLD的轉換,我也通過日期時間 對象! (例如,GETDATE()))

所以我用盡:

SELECT CONVERT(VARCHAR(20), 'lalala', 100) 

,結果是:

lalala 

所以,現在我試着去通過時間值轉換 'LALALA' 串格式(103)。

這是(通過邏輯)應該給我的異常。

,但事實並非如此。

任何合理的解釋?

回答

1

CONVERT既考慮目標類型和表達式的類型看第三個參數是否應該被考慮。如果您將日期時間轉換爲字符串或其他方式,則會考慮第三個參數。在你的例子中,一個字符串被轉換爲一個字符串,所以第三個參數被忽略。

考慮一下:

SELECT 1, CONVERT(datetime, '03/01/2011', 103) 
SELECT 2, CONVERT(datetime, '03/01/2011', 101) 
SELECT 3, CONVERT(varchar, '03/01/2011', 103) 
SELECT 4, CONVERT(varchar, '03/01/2011', 101) 

下面是結果:

--- ----------------------- 
1 2011-01-03 00:00:00.000 

--- ----------------------- 
2 2011-03-01 00:00:00.000 

--- ------------------------------ 
3 03/01/2011 

--- ------------------------------ 
4 03/01/2011 

正如你所看到的,最後兩個「轉換」沒有任何改變,因爲源和目標都類型爲varchar,即使該表達式確實看起來像date/datetime

參考:

0

如果第二個參數(data_to_be_converted)爲datetime,則convert function僅使用第三個參數(style)。

如果它已經varcharreturns的價值,不要做任何事情。

+0

有趣。那麼如果它既不是一個varchar也不是一個日期時間會發生什麼? – 2012-01-04 11:45:13

+0

實際上,當表達式爲float時,'CONVERT' [也考慮第三個參數](http://msdn.microsoft.com/zh-cn/library/ms187928.aspx「CAST和CONVERT(Transact-SQL)」) ','real','money','smallmoney','xml'或'binary' /'varbinary',但這可能超出了問題或答案的範圍。 – 2012-01-04 12:17:09

0

The MSDN documentation for CONVERT說style參數是基於傳遞的值的類型解釋 - 所以我想它會檢查該值,可以知道哪些類型是。

例如,請注意,「1」的樣式的意思是「MM/DD/YY」爲日期時間和「始終8位數字。在科學記數法始終使用」浮點值。

+0

'20120401'這可以是一個字符串,也可以是日期時間...... – 2012-01-04 11:50:41