SQL Server CONVERT() 函数(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据库操作中,数据类型的转换是一个高频需求。无论是处理日期格式、数值计算,还是文本处理,我们都需要将数据从一种类型转换为另一种类型。SQL Server 提供的 CONVERT() 函数,正是解决这一需求的核心工具。对于编程初学者和中级开发者来说,掌握 CONVERT() 函数不仅能提升日常开发效率,还能为处理复杂业务逻辑打下坚实基础。本文将通过循序渐进的方式,结合实际案例,深入讲解 CONVERT() 函数的用法、应用场景和常见技巧。


一、CONVERT() 函数基础语法

1. 函数定义与核心参数

CONVERT() 函数的语法如下:

CONVERT(data_type, expression, [style])  
  • data_type:目标数据类型(如 DATEVARCHARINT 等)。
  • expression:需要转换的原始表达式或列。
  • style:可选参数,用于指定日期或数值的格式代码(仅在转换日期/时间类型时使用)。

2. 函数与 CAST() 的区别

虽然 CONVERT()CAST() 都能实现数据类型转换,但两者有细微区别:

  • CONVERT() 支持在日期类型转换时指定格式代码(如 112 表示 YYYYMMDD),而 CAST() 无法直接控制日期格式。
  • CAST() 的语法更简洁(CAST(expression AS data_type)),但灵活性稍逊。

比喻
可以把 CONVERT() 想象成一个“多功能翻译器”,它不仅能转换语言(数据类型),还能根据场景调整翻译规则(格式代码);而 CAST() 更像一个“直接翻译器”,只能转换语言本身。


二、日期与时间的转换:格式代码是关键

日期类型的转换是 CONVERT() 的核心应用场景之一。通过调整 style 参数,可以灵活控制输出的日期格式。

1. 常见日期格式代码表

以下表格列举了部分常用的日期格式代码及对应输出格式:

Style输出格式示例说明
101MM/DD/YYYY美国格式
102YYYY.MM.DD欧洲格式
103DD/MM/YYYY英国格式
112YYYYMMDD无分隔符的紧凑格式
121YYYY-MM-DD HH:MI:SS标准 ISO 8601 格式

注意:格式代码的具体效果可能因 SQL Server 版本或区域设置而略有差异,建议通过测试确认。

2. 实际案例:销售数据日期格式转换

假设有一个销售记录表 sales,其中 sale_date 列存储的日期格式为 YYYYMMDD(如 20231001),需要将其转换为更易读的 DD-MMM-YYYY 格式。

SELECT  
    CONVERT(VARCHAR, sale_date, 106) AS formatted_date  
FROM sales;  

执行结果:01 Oct 2023106 对应 DD Mon YYYY 格式)。


三、数值与字符串的转换:类型适配与陷阱

1. 数值与字符串的互转

场景1:将字符串转换为数值

当需要对字符串类型的数值列进行计算时,必须先将其转换为 INTFLOAT

-- 原始数据:VARCHAR 类型的 "100"  
SELECT  
    CONVERT(INT, '100') * 2 AS doubled_value;  
-- 输出:200  

场景2:将数值转换为字符串

在拼接字符串时,需将数值类型转换为 VARCHAR

SELECT  
    '订单总金额:' + CONVERT(VARCHAR, 1500.50) AS message;  
-- 输出:订单总金额:1500.5  

2. 注意事项:数据溢出与精度丢失

  • 溢出问题:将大数值转换为 TINYINT(范围 0~255)时会报错:
    SELECT CONVERT(TINYINT, 300); -- 错误:溢出  
    
  • 精度丢失:浮点数转换为整数时会截断小数部分:
    SELECT CONVERT(INT, 99.99); -- 输出:99  
    

四、复杂场景:多类型转换与函数嵌套

1. 将日期转换为字符串并格式化

结合 CONVERT() 和字符串函数,可实现更复杂的格式需求:

-- 将日期转换为 "YYYY年MM月DD日" 格式  
SELECT  
    CONVERT(VARCHAR, GETDATE(), 111) + '日' AS formatted_date;  
-- 输出:2023/10/01日(需进一步替换斜杠为中文格式)  

2. 将数值转换为货币格式

通过 CONVERT()FORMAT() 函数(SQL Server 2012+)组合,可格式化货币值:

SELECT  
    FORMAT(123456.789, 'C', 'zh-CN') AS formatted_currency;  
-- 输出:¥123,456.79  

五、性能优化与最佳实践

1. 避免不必要的转换

频繁使用 CONVERT() 可能影响查询性能,尤其在大数据量时。应优先通过 ALTER TABLE 调整列的数据类型,而非依赖运行时转换。

2. 处理 NULL 值

转换 NULL 值时需谨慎,通常返回 NULL

SELECT CONVERT(INT, NULL); -- 输出:NULL  

若需默认值,可结合 COALESCE()

SELECT COALESCE(CONVERT(INT, NULL), 0); -- 输出:0  

六、进阶技巧:时间戳与自定义格式

1. 时间戳的毫秒处理

SQL Server 的 DATETIME 类型精确到 3 毫秒,而 DATETIME2 支持更高精度。通过 CONVERT() 可提取特定部分:

SELECT  
    CONVERT(TIME, GETDATE(), 108) AS current_time; -- 输出:14:30:45  

2. 自定义日期格式字符串

通过 CONVERT()style 参数无法覆盖所有格式需求时,可结合字符串函数拼接:

-- 将日期转换为 "周几, YYYY-MM-DD" 格式  
SELECT  
    DATENAME(WEEKDAY, GETDATE()) + ', ' +  
    CONVERT(VARCHAR, GETDATE(), 120) AS custom_format;  
-- 输出:Monday, 2023-10-01  

结论

SQL Server CONVERT() 函数是数据类型转换的核心工具,其灵活性和功能深度使其成为开发者必备技能。通过掌握日期格式代码、数值类型适配、函数嵌套等技巧,开发者可以高效处理数据清洗、格式化输出等任务。在实际应用中,需注意性能优化和边界条件(如 NULL 值、数据溢出),并结合其他函数(如 FORMAT()DATENAME())扩展功能。

建议读者通过以下方式巩固知识:

  1. 在本地 SQL Server 环境中实践本文案例;
  2. 尝试将 CONVERT() 与业务场景结合(如订单时间分析、用户注册信息处理);
  3. 探索 CAST()TRY_CONVERT() 等相关函数的差异。

掌握 CONVERT() 函数,不仅能提升日常开发效率,更能为处理复杂数据问题提供坚实基础。

最新发布