sql转换忽略格式?

时间:2012-01-04 11:30:01

标签: sql-server-2005

跑步:

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

将导致:

Jan  4 2012  1:25PM

多年来我一直都知道这一点。

然而,昨天,在我开车的时候,我想到了自己:

  

喂!我给了他格式103,这是日期时间格式,

     

但我实际上并没有告诉我也通过日期时间的转换   对象! (例如getdate()))

所以我试过了:

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

结果是:

lalala

所以,现在我试图通过日期时间格式(103)将'lalala'转换为字符串。

(按逻辑)应该给我例外。

但事实并非如此。

有任何合理的解释吗?

3 个答案:

答案 0 :(得分: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 / { {1}}。

参考:

答案 1 :(得分:0)

如果第二个参数(style)为data_to_be_converted,则convert function仅使用第三个参数(datetime)。

如果已经varcharreturns值,则不做任何事情。

答案 2 :(得分:0)

The MSDN documentation for CONVERT表示style参数是根据传递的值的类型解释的 - 所以我猜它会检查值并且可以判断它是哪种类型。

例如,请注意,对于浮动值,样式“1”表示日期时间为“mm / dd / yy”,“始终为8位数。始终以科学计数法使用”。