游乐游手机版
首页/数据库/文章详情

一文掌握SQL Server日期显示格式四种完整设置方法

时间:2026-06-14 07:01
在 SQL Server 中处理日期格式,几乎是每个数据库开发者都会碰到的场景。无论是做报表展示、生成分表名,还是进行日期筛选,格式的转换和控制都绕不过去。这篇我们就把这件事彻底讲透——从基础函数到实战技巧,从预定义格式到自定义方案,覆盖日常开发中所有常见的日期显示需求。 一、核心函数:CONVER

在 SQL Server 中处理日期格式,几乎是每个数据库开发者都会碰到的场景。无论是做报表展示、生成分表名,还是进行日期筛选,格式的转换和控制都绕不过去。这篇我们就把这件事彻底讲透——从基础函数到实战技巧,从预定义格式到自定义方案,覆盖日常开发中所有常见的日期显示需求。

SQLServer中设置日期显示格式的四种方法

一、核心函数:CONVERT(兼容所有版本,推荐)

先说 CONVERT——这是 SQL Server 里最基础、兼容性最好的日期转换利器。无论你用的是 SQL Server 2008 还是 2022,它都稳如磐石。语法很简单:

CONVERT(目标类型, 日期值, 格式代码) 

目标类型一般设为 VARCHARNVARCHAR(长度按需指定)。格式代码是 SQL Server 预定义的数字编码,不同数字对应不同格式。

1. 最常用的预定义格式(必记)

下面这几组代码,在日常开发中间出镜率最高,值得记忆:

DECLARE @Date DATETIME = GETDATE();

-- 1. 仅日期(YYYY-MM-DD):格式代码 23
SELECT CONVERT(VARCHAR(10), @Date, 23) AS 日期_YYYYMMDD; -- 输出:2026-02-27

-- 2. 仅时间(HH:MI:SS):格式代码 8
SELECT CONVERT(VARCHAR(8), @Date, 8) AS 时间_HHMMSS; -- 输出:15:30:45

-- 3. 日期+时间(YYYY-MM-DD HH:MI:SS):格式代码 120
SELECT CONVERT(VARCHAR(19), @Date, 120) AS 日期时间_完整; -- 输出:2026-02-27 15:30:45

-- 4. 纯数字日期(YYYYMMDD):格式代码 112
SELECT CONVERT(VARCHAR(8), @Date, 112) AS 日期_纯数字; -- 输出:20260227(适配你的分表名)

-- 5. 中文格式(YYYY年MM月DD日):格式代码 111 + 替换符号
SELECT REPLACE(REPLACE(CONVERT(VARCHAR(10), @Date, 111), '/', '年'), '/', '月') + '日' AS 日期_中文;
-- 输出:2026年02月27日

-- 6. 带毫秒的时间(HH:MI:SS.MMM):格式代码 121
SELECT CONVERT(VARCHAR(23), @Date, 121) AS 日期时间_带毫秒; -- 输出:2026-02-27 15:30:45.123

2. 常用格式代码速查表

为了方便查阅,这里整理了一份速查表:

格式代码 格式示例 适用场景
815:30:45仅显示时间
1002-27-26美式短日期(MM-DD-YY)
232026-02-27标准日期(推荐)
10102/27/2026美式日期(MM/DD/YYYY)
11220260227纯数字日期(分表名 / 文件名)
1202026-02-27 15:30:45标准日期时间(推荐)
1212026-02-27 15:30:45.123带毫秒的日期时间

二、灵活自定义:FORMAT 函数(SQL Server 2012+)

如果觉得 CONVERT 的预定义格式不够灵活,那 FORMAT 就是答案。它支持自定义格式字符串(和 C#/.NET 的日期格式完全一致),你甚至可以指定区域设置(比如输出中文星期)。语法:

FORMAT(日期值, '自定义格式', '区域设置') 

1. 常用自定义格式示例

DECLARE @Date DATETIME = GETDATE();

-- 1. 自定义日期(YYYY年MM月DD日 HH时MI分SS秒)
SELECT FORMAT(@Date, 'yyyy年MM月dd日 HH时mm分ss秒') AS 日期_中文完整;
-- 输出:2026年02月27日 15时30分45秒

-- 2. 短日期(YY-MM-DD)
SELECT FORMAT(@Date, 'yy-MM-dd') AS 日期_短格式; -- 输出:26-02-27

-- 3. 星期几
SELECT FORMAT(@Date, 'dddd') AS 星期_英文; -- 输出:Friday
SELECT FORMAT(@Date, 'dddd', 'zh-CN') AS 星期_中文; -- 输出:星期五

-- 4. 月份名称
SELECT FORMAT(@Date, 'MMMM', 'zh-CN') AS 月份_中文; -- 输出:二月

-- 5. 24小时制/12小时制
SELECT FORMAT(@Date, 'hh:mm:ss tt') AS 时间_12小时制; -- 输出:03:30:45 下午
SELECT FORMAT(@Date, 'HH:mm:ss') AS 时间_24小时制; -- 输出:15:30:45

2. 自定义格式符速查表

格式符的具体含义也列出来,方便组合使用:

格式符 说明 示例
yyyy4 位年2026
yy2 位年26
MM2 位月(补 0)02
M1 位月(不补 0)2
dd2 位日(补 0)27
d1 位日(不补 0)27
HH24 小时制(补 0)15
hh12 小时制(补 0)03
mm分钟(补 0)30
ss秒(补 0)45
fff毫秒123
tt上午 / 下午(12 小时制)下午

三、全局格式设置(影响会话 / 服务器)

如果你希望整个会话甚至服务器的日期显示格式统一,可以修改 DATEFORMAT 或服务器配置。但说实话,这种“一刀切”的做法在实际项目中用得不多——更多时候我们还是用 CONVERT 或 FORMAT 做局部控制。

1. 会话级设置(仅当前连接有效)

-- 设置日期解析/显示的顺序:年-月-日(dmy=日-月-年,mdy=月-日-年)
SET DATEFORMAT ymd;

-- 设置语言(影响日期的中文/英文显示)
SET LANGUAGE Chinese; -- 中文
-- SET LANGUAGE English; -- 英文

-- 验证:默认显示格式会随语言变化
SELECT GETDATE() AS 默认日期格式;

2. 服务器级设置(需管理员权限)

通过 SSMS 修改:右键服务器 →「属性」→「高级」→ 找到「默认语言」「日期格式」,修改后重启 SQL Server 服务。

需要提醒的是,服务器级别的格式修改可能会影响到其他业务系统的表现,实际建议优先使用 CONVERT/FORMAT 做局部转换,谁用谁知道。

四、实战场景示例

理论说完了,来看看几个真实场景下的用法。

场景 1:生成分表名(如 DefectResult2026021)

-- 获取当前年月的纯数字格式,拼接到分表名
DECLARE @TableName NVARCHAR(100);
SET @TableName = N'DefectResult' + CONVERT(VARCHAR(6), GETDATE(), 112) + N'1';
SELECT @TableName AS 分表名; -- 输出:DefectResult2026021

场景 2:查询结果显示中文日期

-- 查询订单表,显示中文格式的下单时间
SELECT 
    OrderID,
    FORMAT(CreateTime, 'yyyy年MM月dd日 HH:mm:ss', 'zh-CN') AS 下单时间,
    FORMAT(CreateTime, 'dddd', 'zh-CN') AS 下单星期
FROM Orders;

场景 3:按指定格式筛选日期

-- 筛选2026年2月的订单(用112格式避免格式冲突)
SELECT * FROM Orders
WHERE CONVERT(VARCHAR(6), CreateTime, 112) = '202602';

五、避坑点

最后聊几个容易翻车的点:

  1. 避免直接比较字符串日期:❌ 错误:WHERE CONVERT(VARCHAR(10), CreateTime, 23) = '2026-02-27';✅ 正确:WHERE CreateTime >= '2026-02-27' AND CreateTime < '2026-02-28'——直接比较日期类型,利用索引才是正道。
  2. FORMAT 函数的性能问题FORMAT 虽然灵活,但性能比 CONVERT 差不少。如果是百万级以上的数据量,优先用 CONVERT
  3. NULL 日期处理:转换前最好用 ISNULL 处理 NULL,不然结果直接飘 NULL:
SELECT ISNULL(CONVERT(VARCHAR(10), CreateTime, 23), '未填写') AS 日期
FROM Users;

总结

梳理一下核心要点:

  1. 兼容性优先:用 CONVERT(字段, 格式代码)(如 23=YYYY-MM-DD、112=YYYYMMDD),适配所有 SQL Server 版本;
  2. 灵活性优先:SQL Server 2012+ 用 FORMAT(字段, '自定义格式', 'zh-CN'),支持中文 / 自定义格式;
  3. 核心场景
    • 分表名 / 文件名:用 CONVERT(..., 112) 生成纯数字日期;
    • 前端展示:用 FORMAT 生成中文 / 自定义格式;
    • 日期筛选:直接比较日期类型,避免转换为字符串;
  4. 避坑:避免全局修改日期格式,优先局部转换;大数据量场景慎用 FORMAT

没有银弹,看场景选最实用的就行。希望这篇文章能帮你搞定 SQL Server 日期格式的日常甩锅。

来源:https://www.jb51.net/database/36130493a.htm
上一篇千万级大表新增字段的实战方案与技巧 下一篇SQL Server常见约束条件用法详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须