SQL转换忽略格式?

问题描述:

运行:SQL转换忽略格式?

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

将导致:

Jan 4 2012 1:25PM 

我一直都知道这几年。

然而,昨天,当我开车,我认为我自己:

嘿!我给他的格式为103这是日期时间格式,

但我没有实际TOLD的转换,我也通过日期时间 对象! (例如,GETDATE()))

所以我用尽:

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

,结果是:

lalala 

所以,现在我试着去通过时间值转换 'LALALA' 串格式(103)。

这是(通过逻辑)应该给我的异常。

,但事实并非如此。

任何合理的解释?

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

参考:

如果第二个参数(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

The MSDN documentation for CONVERT说style参数是基于传递的值的类型解释 - 所以我想它会检查该值,可以知道哪些类型是。

例如,请注意,“1”的样式的意思是“MM/DD/YY”为日期时间和“始终8位数字。在科学记数法始终使用”浮点值。

+0

'20120401'这可以是一个字符串,也可以是日期时间...... – 2012-01-04 11:50:41