在SQL数据处理中,类型转换是非常常见的操作,CAST和CONVERT是两个核心的转换函数,二者都能实现数据类型转换,但在语法和适用场景上存在明显差异。掌握这两个函数的使用技巧,能够有效提升SQL语句的编写效率和数据处理的准确性。

CAST函数的基本用法
CAST是SQL标准定义的类型转换函数,几乎所有关系型数据库都支持,通用性更强。它的语法结构非常简单,核心是将表达式转换为指定的目标数据类型。
CAST语法格式
-- CAST标准语法 CAST ( expression AS target_data_type [ ( length ) ] )
其中expression是要转换的原始值或者字段,target_data_type是目标数据类型,可选的长度参数仅适用于部分数据类型比如varchar、char等。
CAST使用示例
以下是几个常见的CAST使用场景:
- 将字符串转换为整数类型
- 将浮点型转换为 decimal 类型保留小数位
- 将日期转换为字符串类型
-- 字符串转整数
SELECT CAST('123' AS INT) AS result;
-- 浮点型转decimal,保留2位小数
SELECT CAST(3.1415 AS DECIMAL(10,2)) AS result;
-- 日期转字符串
SELECT CAST(GETDATE() AS VARCHAR(20)) AS result;
CONVERT函数的基本用法
CONVERT是SQL Server中特有的类型转换函数,功能比CAST更丰富,支持指定转换的样式,尤其是在日期和时间类型的转换上优势明显。
CONVERT语法格式
-- CONVERT语法 CONVERT ( target_data_type [ ( length ) ] , expression [ , style ] )
和CAST不同的是,CONVERT多了一个可选的style参数,这个参数用于指定日期、时间、货币等类型的转换格式,是CONVERT的核心特性。
CONVERT使用示例
以下是CONVERT的常见使用场景:
- 基础类型转换,和CAST功能类似
- 日期按指定格式转换为字符串
- 货币类型按指定样式转换
-- 基础类型转换,和CAST效果一致 SELECT CONVERT(INT, '456') AS result; -- 日期转换为yyyy-mm-dd格式,style参数为23 SELECT CONVERT(VARCHAR(10), GETDATE(), 23) AS result; -- 日期转换为yyyy年mm月dd日格式,style参数为111 SELECT CONVERT(VARCHAR(20), GETDATE(), 111) AS result;
CAST和CONVERT的核心差异
虽然两个函数都能实现类型转换,但二者存在明显的区别,开发者需要根据场景选择:
| 对比维度 | CAST | CONVERT |
|---|---|---|
| 通用性 | 符合SQL标准,几乎所有数据库支持 | 仅SQL Server等部分数据库支持 |
| 功能丰富度 | 仅支持基础类型转换,无样式参数 | 支持样式参数,可指定日期、货币等转换格式 |
| 语法顺序 | expression在前,目标类型在后 | 目标类型在前,expression在后,可选样式参数在最后 |
常见使用场景与技巧
场景1:跨数据库兼容的转换需求
如果编写的SQL需要适配多种数据库,优先使用CAST,避免CONVERT带来的兼容性问题。
-- 跨数据库兼容的类型转换
SELECT
CAST(price AS DECIMAL(10,2)) AS formatted_price,
CAST(create_time AS VARCHAR(20)) AS time_str
FROM product;
场景2:SQL Server中日期格式化需求
如果在SQL Server中需要将日期转换为指定格式的字符串,使用CONVERT的style参数会更方便,不需要额外做字符串拼接处理。
-- 获取yyyy-mm-dd hh:mi:ss格式的当前时间字符串 SELECT CONVERT(VARCHAR(20), GETDATE(), 120) AS current_time; -- 获取dd/mm/yyyy格式的日期字符串 SELECT CONVERT(VARCHAR(10), GETDATE(), 103) AS date_str;
场景3:处理转换失败的容错
类型转换时如果原始值不符合目标类型的要求,会直接报错,可以结合TRY_CAST或者TRY_CONVERT函数做容错处理,这两个函数是CAST和CONVERT的容错版本,转换失败会返回NULL而不是报错。
-- 转换失败返回NULL,不会报错
SELECT TRY_CAST('abc' AS INT) AS result; -- 返回NULL
SELECT TRY_CONVERT(INT, '123') AS result; -- 返回123
注意事项
- 转换时要确保原始值的格式符合目标类型的要求,比如把字符串'abc'转为INT会直接报错
- 使用CAST转换日期时,无法指定输出格式,只能得到数据库默认的日期字符串格式
- 如果不需要指定转换样式,优先使用CAST保证代码的可移植性
- 长度参数仅对字符型、二进制型等部分数据类型生效,数值类型不需要指定长度