【发布时间】:2010-10-16 23:30:16
【问题描述】:
关于何时应使用 CAST 与 CONVERT 的一般指导是什么?是否存在与选择一个与另一个相关的性能问题?更接近 ANSI-SQL 吗?
【问题讨论】:
标签: sql sql-server database tsql
关于何时应使用 CAST 与 CONVERT 的一般指导是什么?是否存在与选择一个与另一个相关的性能问题?更接近 ANSI-SQL 吗?
【问题讨论】:
标签: sql sql-server database tsql
Convert 有一个样式参数用于日期到字符串的转换。
【讨论】:
CONVERT 是特定于 SQL Server 的,CAST 是 ANSI。
CONVERT 更灵活,您可以格式化日期等。除此之外,它们几乎相同。如果您不关心扩展功能,请使用CAST。
编辑:
正如@beruic 和@C-F 在下面的 cmets 中所指出的,使用隐式转换(即既不使用 CAST 也不使用 CONVERT)时可能会丢失精度。有关详细信息,请参阅CAST and CONVERT,尤其是此图:SQL Server Data Type Conversion Chart。有了这些额外的信息,最初的建议仍然保持不变。尽可能使用 CAST。
【讨论】:
CAST 是标准 SQL,但 CONVERT 仅适用于方言 T-SQL。在日期时间的情况下,我们在转换方面有一点优势。
使用 CAST,您可以指明表达式和目标类型;使用 CONVERT,还有第三个参数表示转换的样式,它支持某些转换,例如字符串与日期和时间值之间的转换。例如,CONVERT(DATE, '1/2/2012', 101) 使用代表美国标准的样式 101 将文字字符串转换为 DATE。
【讨论】:
CAST 使用 ANSI 标准。在可移植性的情况下,这将适用于其他平台。 CONVERT 特定于 sql server。但是功能很强大。您可以为日期指定不同的样式
【讨论】:
似乎没有人注意到的东西是可读性。有……
CONVERT(SomeType,
SomeReallyLongExpression
+ ThatMayEvenSpan
+ MultipleLines
)
……可能比……更容易理解
CAST(SomeReallyLongExpression
+ ThatMayEvenSpan
+ MultipleLines
AS SomeType
)
【讨论】:
CAST(Column1 AS int) 比 CONVERT(int, Column1) 更符合逻辑,即使对于长表达式也是如此
为了扩展the above answercopied by Shakti,我实际上已经能够衡量这两个函数之间的性能差异。
我正在测试this question 解决方案变体的性能,发现使用CAST 时标准差和最大运行时间更大。
*以毫秒为单位的时间,根据precision of the DateTime type四舍五入到最接近的1/300秒
【讨论】:
您也不应该使用CAST 来获取哈希算法的文本。 CAST(HASHBYTES('...') AS VARCHAR(32)) 与 CONVERT(VARCHAR(32), HASHBYTES('...'), 2) 不同。如果没有最后一个参数,结果将是相同的,但不是可读的文本。据我所知,您不能在CAST 中指定最后一个参数。
【讨论】: