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
)。
如果它已经varchar
它returns
的价值,不要做任何事情。
The MSDN documentation for CONVERT说style参数是基于传递的值的类型解释 - 所以我想它会检查该值,可以知道哪些类型是。
例如,请注意,“1”的样式的意思是“MM/DD/YY”为日期时间和“始终8位数字。在科学记数法始终使用”浮点值。
'20120401'这可以是一个字符串,也可以是日期时间...... – 2012-01-04 11:50:41
有趣。那么如果它既不是一个varchar也不是一个日期时间会发生什么? – 2012-01-04 11:45:13
实际上,当表达式为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