什么情况下应该使用 CAST
而不是 CONVERT
?选择其中一个是否会有性能问题?哪个更接近ANSI-SQL标准?
什么情况下应该使用 CAST
而不是 CONVERT
?选择其中一个是否会有性能问题?哪个更接近ANSI-SQL标准?
CONVERT
是SQL Server特有的,而CAST
是ANSI标准。
CONVERT
更加灵活,可以格式化日期等。除此之外,它们基本上是相同的。如果您不关心扩展功能,请使用CAST
。
编辑:
如@beruic和@C-F在下面的评论中所指出的,隐式转换(即不使用CAST或CONVERT)可能会导致精度损失。有关更多信息,请参见CAST and CONVERT,尤其是这张图表:SQL Server Data Type Conversion Chart。具有这些额外信息后,原始建议仍然保持不变。尽可能使用CAST。
CONVERT
函数有一个style参数,用于将日期转换为字符串。
https://learn.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
就上面的答案(由Shakti复制)进行补充,我实际上能够衡量这两个函数之间的性能差异。
我测试了解决此问题的各种方案的性能,并发现使用CAST
时标准差和最大运行时间更长。
*时间以毫秒为单位,按照
DateTime
类型的精度四舍五入到最接近的1/300秒
CONVERT(tinyint,...,0)
,所以你的测试可能有问题。https://dbfiddle.uk/psHeIX_X - undefinedCAST 是标准的 SQL 语法,但 CONVERT 是 T-SQL 方言专用的。在 datetime 类型的情况下,convert 有一定的优势。
使用 CAST,你需要指定表达式和目标类型;而使用 CONVERT,还需要提供第三个参数来表示转换的样式,并且该样式仅适用于特定的转换,例如字符字符串和日期时间值之间的转换。例如,CONVERT(DATE, '1/2/2012', 101) 将按照样式 101 将字面字符转换为 DATE 类型,该样式代表美国标准。
似乎没有人注意到的是可读性。有….
CONVERT(SomeType,
SomeReallyLongExpression
+ ThatMayEvenSpan
+ MultipleLines
)
可能比…更容易理解。
CAST(SomeReallyLongExpression
+ ThatMayEvenSpan
+ MultipleLines
AS SomeType
)
CAST(Column1 AS int)
比CONVERT(int, Column1)
更容易理解。 - S.SerpooshanCAST
是标准,我经常看到CAST
,因此对我来说它已成为更易读的版本。 - BilbottomCAST使用ANSI标准。在可移植性方面,这将适用于其他平台。CONVERT是特定于SQL Server的。但它是非常强大的函数。您可以为日期指定不同的样式。
您也不应该使用CAST
来获取哈希算法的文本。 CAST(HASHBYTES('...') AS VARCHAR(32))
与CONVERT(VARCHAR(32), HASHBYTES('...'), 2)
不同。如果没有最后一个参数,结果将是相同的,但不是可读文本。据我所知,您无法在CAST
中指定该参数。