sql server中日期类型转字符串几种写法比较

在 SQL Server 中,将 日期类型(如 DATE、DATETIME、DATETIME2)转换为字符串,有多种方法,适用于不同版本和格式需求。以下是常用且高效的写法:

  1. 使用 CONVERT() 函数(推荐,兼容性好)

CONVERT 支持多种预定义的 style 编码,可快速格式化日期。

常用格式示例:

sql 复制代码
DECLARE @dt DATETIME = '2025-11-14 15:30:45';

-- yyyy-MM-dd(标准日期)
SELECT CONVERT(VARCHAR, @dt, 23);  -- 结果: '2025-11-14'

-- yyyy-MM-dd HH:mm:ss
SELECT CONVERT(VARCHAR, @dt, 120); -- 结果: '2025-11-14 15:30:45'

-- MM/dd/yyyy
SELECT CONVERT(VARCHAR, @dt, 101); -- 结果: '11/14/2025'

-- dd/MM/yyyy
SELECT CONVERT(VARCHAR, @dt, 103); -- 结果: '14/11/2025'

-- yyyy年MM月dd日(需拼接)
SELECT 
    CAST(YEAR(@dt) AS VARCHAR) + '年' +
    RIGHT('0' + CAST(MONTH(@dt) AS VARCHAR), 2) + '月' +
    RIGHT('0' + CAST(DAY(@dt) AS VARCHAR), 2) + '日';
-- 结果: '2025年11月14日'
  1. 使用 FORMAT() 函数(SQL Server 2012+,灵活但性能低)

适合需要自定义格式或本地化显示(如中文)的场景。

sql 复制代码
DECLARE @dt DATETIME = '2025-11-14 15:30:45';

SELECT FORMAT(@dt, 'yyyy-MM-dd');        -- '2025-11-14'
SELECT FORMAT(@dt, 'yyyy/MM/dd');        -- '2025/11/14'
SELECT FORMAT(@dt, 'yyyy年MM月dd日');     -- '2025年11月14日'
SELECT FORMAT(@dt, 'MMM dd, yyyy');      -- 'Nov 14, 2025'
SELECT FORMAT(@dt, 'dddd, MMMM dd', 'zh-CN'); -- '星期五, 十一月 14'

注意:FORMAT() 性能较差,不要在大数据量查询或 WHERE 条件中使用。

  1. 拼接 YEAR() / MONTH() / DAY()(兼容老版本)

适用于 SQL Server 2008 及更早版本,或需要精确控制补零的情况。

sql 复制代码
DECLARE @dt DATE = '2025-11-05';

SELECT 
    CAST(YEAR(@dt) AS VARCHAR(4)) + '-' +
    RIGHT('0' + CAST(MONTH(@dt) AS VARCHAR(2)), 2) + '-' +
    RIGHT('0' + CAST(DAY(@dt) AS VARCHAR(2)), 2) AS FormattedDate;
-- 结果: '2025-11-05'

各方法对比

实际应用示例

场景:按"年月"分组统计订单(高性能写法)

sql 复制代码
SELECT 
    LEFT(CONVERT(VARCHAR, OrderDate, 23), 7) AS YearMonth,
    COUNT(*) AS OrderCount
FROM Orders
GROUP BY LEFT(CONVERT(VARCHAR, OrderDate, 23), 7)
ORDER BY YearMonth;

错误做法(避免!)

sql 复制代码
-- 不要这样写:隐式转换不可靠,且格式依赖系统设置
SELECT '' + GETDATE();  -- 结果不确定!

-- 不要在 WHERE 中用 FORMAT 或 CONVERT 包裹字段
WHERE FORMAT(OrderDate, 'yyyy-MM') = '2025-11';  -- 全表扫描!
相关推荐
复园电子7 小时前
企业级PDF批量盖章方案选型指南
数据库·pdf
Championship.23.2412 小时前
Linux 3.0 锁机制与故障排查详解
linux·运维·服务器
AI-好学者14 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
风123456789~14 小时前
【Linux专栏】ls 排除某个文件
linux·运维·服务器
其实防守也摸鱼15 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚15 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔72515 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋15 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_16 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾16 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#