cast是标准sql跨数据库通用类型转换函数,语法为cast(表达式 as 目标类型),不支持格式化且失败报错;convert是sql server特有函数,支持样式码实现日期数字格式化,但不可移植。

SQL 中的 CAST 和 CONVERT 都用于数据类型转换,功能相似但语法和兼容性有区别。掌握它们的用法、差异和典型场景,能避免报错、提升查询健壮性。
CAST:标准 SQL 语法,跨数据库通用
语法简洁,ANSI 标准,主流数据库(PostgreSQL、MySQL 8.0+、SQL Server、Oracle)均支持。
- 格式固定:
CAST(表达式 AS 目标类型),例如CAST('2023-10-05' AS DATE) - 不支持格式化(如日期转字符串时指定 'yyyy-MM-dd'),仅做类型映射
- 转换失败会直接报错(如
CAST('abc' AS INT)),建议配合TRY_CAST(SQL Server/PostgreSQL)或条件判断使用 - 适合写可移植 SQL,尤其在多数据库环境或 ORM 动态生成语句时更安全
CONVERT:SQL Server 特有,支持格式化参数
SQL Server 专属函数,语法更灵活,尤其擅长日期/数字格式控制。
- 基本用法:
CONVERT(目标类型, 表达式),等价于 CAST,如CONVERT(DATE, '2023-10-05') - 关键优势:支持第三个参数——样式码(style),用于格式化日期或数字,例如:
CONVERT(VARCHAR, GETDATE(), 120)→'2023-10-05 14:30:22'CONVERT(VARCHAR, 12345.67, 1)→'12,345.67' - 注意:样式码仅对特定类型生效(如 DATE、DATETIME、MONEY),且不同版本支持略有差异
- 不可移植到 MySQL 或 PostgreSQL,纯 SQL Server 项目中可优先考虑
什么时候该选 CAST?什么时候用 CONVERT?
核心看需求是否涉及“格式控制”与“环境约束”:
- 需要把
INT转成VARCHAR且不关心千分位或小数位 → 用CAST更清晰直接 - 要把
DATETIME转成带中文年月日的字符串(如‘2023年10月05日’)→ SQL Server 中可用CONVERT+ 样式码,或拼接FORMAT()(但性能略低) - 写视图或存储过程供多个数据库调用 → 必须用
CAST,避免语法报错 - 处理用户输入的字符串转数值,可能含空格或异常值 → 先用
TRIM()清理,再用TRY_CAST(SQL Server)或SAFE_CAST(BigQuery)捕获失败,而非硬转
常见坑与避坑建议
类型转换看着简单,实际容易引发隐式转换、截断、时区或精度丢失问题:
-
CAST('123.456' AS DECIMAL(5,2))会四舍五入为123.46,不是截断;若目标精度不够(如DECIMAL(4,2)),则报错 -
CONVERT(VARCHAR, 0xABCDEF)默认转成十六进制字符串'0xABCDEF',但加样式码 1 可得'abcdef'(小写无前缀) - 日期字符串未带时间部分时,
CAST('2023-10-05' AS DATETIME)在 SQL Server 中默认补为'2023-10-05 00:00:00.000',而某些旧版客户端可能按本地时区解释 - 避免在 WHERE 条件中对字段用 CAST/CONVERT(如
WHERE CAST(order_date AS DATE) = '2023-10-05'),会导致索引失效;应改写为范围查询:WHERE order_date >= '2023-10-05' AND order_date










