在SQL的实际开发场景中,经常会遇到不同数据类型的数据需要共同参与运算、比较或者存储的情况,比如将字符串类型的数字和整数类型的字段相加,或是将日期时间类型的数据转换为指定格式的字符串,这时候就需要使用数据类型强制转换功能。CAST和CONVERT是SQL标准及主流数据库中都支持的两个类型转换函数,能够灵活实现各类数据类型的转换需求。

CAST函数的基本用法
CAST函数是SQL标准的类型转换函数,语法简洁通用,在大多数关系型数据库中都能兼容使用,基本语法格式如下:
CAST(expression AS target_data_type)
其中expression表示需要转换的字段或者表达式,target_data_type表示目标数据类型。以下是一些常见的使用场景示例:
数值类型转换
将字符串类型的数字转换为整数类型:
-- 将字符串'123'转换为整数类型
SELECT CAST('123' AS SIGNED) AS converted_num;
-- 将浮点型转换为整数,会直接截断小数部分
SELECT CAST(123.89 AS SIGNED) AS truncated_num;
日期时间类型转换
将日期时间类型转换为字符串类型:
-- 将当前日期转换为YYYY-MM-DD格式的字符串 SELECT CAST(NOW() AS CHAR) AS date_str; -- 将日期类型转换为指定格式的字符串(部分数据库支持格式参数) SELECT CAST(CURDATE() AS CHAR) AS cur_date_str;
字符串类型转换
将整数转换为字符串类型进行拼接:
-- 将用户ID转换为字符串后和前缀拼接
SELECT CONCAT('USER_', CAST(user_id AS CHAR)) AS user_code FROM user_table;
CONVERT函数的基本用法
CONVERT函数的功能与CAST类似,但是语法形式和部分数据库中的扩展功能有所不同,基本语法如下:
-- 通用语法 CONVERT(expression, target_data_type) -- MySQL等数据库支持的扩展语法,可指定转换格式 CONVERT(expression, target_data_type, format_code)
以下是CONVERT函数的常见使用示例:
基础类型转换
实现和CAST相同的数值转换功能:
-- 将字符串转换为整数
SELECT CONVERT('456', SIGNED) AS converted_num;
-- 将浮点型转换为十进制类型
SELECT CONVERT(78.92, DECIMAL(10,2)) AS decimal_num;
带格式的日期转换
在MySQL中,CONVERT函数支持通过格式码指定日期转换的格式,这是它相比CAST的一大优势:
-- 将当前日期时间转换为YYYY年MM月DD日 HH:MI:SS格式 SELECT CONVERT(NOW(), CHAR, 20) AS formatted_date; -- 常用格式码:20对应YYYY-MM-DD HH:MI:SS,3对应YYYYMMDD SELECT CONVERT(CURDATE(), CHAR, 3) AS short_date;
CAST与CONVERT的区别对比
两个函数的核心功能都是实现数据类型转换,但在使用上存在以下差异:
| 对比维度 | CAST函数 | CONVERT函数 |
|---|---|---|
| 语法标准 | SQL标准语法,兼容性更好,几乎所有关系型数据库都支持 | 非SQL标准语法,不同数据库的实现存在差异,部分扩展功能仅特定数据库支持 |
| 格式控制 | 不支持额外格式参数,转换后的格式由数据库默认规则决定 | 部分数据库(如MySQL)支持第三个格式参数,可自定义转换后的输出格式 |
| 语法复杂度 | 语法简洁,只有表达式和目标类型两个参数 | 语法相对灵活,可根据数据库支持情况添加扩展参数 |
使用注意事项
- 转换时需要确保源数据能够被正确转换为目标类型,比如将包含字母的字符串转换为整数会直接报错。
- 不同数据库支持的目标数据类型存在差异,使用时需要参考对应数据库的官方文档。
- 进行日期时间转换时,如果涉及自定义格式,优先选择支持格式参数的CONVERT函数,否则使用CAST即可。
- 类型转换操作可能会影响查询性能,尤其是大表上的字段转换,尽量避免在WHERE条件中对字段进行类型转换,防止索引失效。
实际应用示例
假设存在一张订单表order_table,其中order_amount是字符串类型存储的金额,create_time是日期时间类型,需要统计2024年5月的订单总金额,并将金额转换为保留两位小数的格式:
-- 使用CAST转换金额类型并求和
SELECT
SUM(CAST(order_amount AS DECIMAL(10,2))) AS total_amount
FROM order_table
WHERE CAST(create_time AS DATE) >= '2024-05-01'
AND CAST(create_time AS DATE) < '2024-06-01';
-- 使用CONVERT实现相同功能,MySQL环境下可指定日期格式
SELECT
SUM(CONVERT(order_amount, DECIMAL(10,2))) AS total_amount
FROM order_table
WHERE CONVERT(create_time, DATE, 3) >= '20240501'
AND CONVERT(create_time, DATE, 3) < '20240601';
通过以上示例可以看出,两种函数都可以实现需求,开发者可以根据自己使用的数据库类型和具体场景选择合适的函数。