如何将SQL Server全局日期/日期时间格式改为dd/mm/yyyy
首先得明确一个核心点:SQL Server存储日期/时间数据时是用二进制格式,根本不保存显示格式。你看到的YYYY-MM-DD其实是客户端(比如SSMS、你的应用程序)把二进制数据转换成字符串时用的默认格式,或者是SQL Server在隐式转换日期类型为字符串时的默认规则。
你修改实例或用户默认语言没效果,大概率是因为你查询的是date、datetime2这类较新的日期类型——这类类型的默认字符串输出是固定的ISO 8601格式(YYYY-MM-DD),不受语言或DATEFORMAT设置影响。而老的datetime类型的隐式转换才会受语言设置影响,比如设置默认语言为British后,SELECT CAST(GETDATE() AS DATETIME)会返回类似05 Oct 2024 10:45:00的格式。
那回到你的需求:不用FORMAT函数,全局修改所有日期的显示格式,可行的方案有这些:
1. 客户端层面配置(最有效,推荐)
既然显示格式是客户端处理的,那直接在客户端设置里改是最直接的:
- SSMS用户:打开「工具」→「选项」→「环境」→「区域设置」,调整日期格式;或者在查询窗口的「查询选项」里,找到「结果」→「网格」,修改日期时间的显示格式。
- 应用程序用户:如果是自己开发的应用,在连接字符串里添加
DateTime Format参数(比如ADO.NET里用DateTime Format=dd/MM/yyyy),或者在应用代码里统一设置日期的显示格式,把从数据库拿到的日期值转换成你想要的字符串格式。
2. 会话级默认设置(针对老datetime类型)
如果你的数据库里主要用的是datetime类型,可以通过登录触发器让每个会话自动应用指定的格式设置,不用每次手动执行SET命令:
CREATE TRIGGER SetDefaultDateFormat ON ALL SERVER FOR LOGON AS BEGIN SET NOCOUNT ON; -- 设置日期格式为日/月/年,对应格式103 SET DATEFORMAT dmy; -- 或者设置语言,比如英式英语 -- SET LANGUAGE British; END;
注意:这个方法只对datetime、smalldatetime这类老类型的隐式转换有效,date、datetime2还是会显示成YYYY-MM-DD。
3. 数据库层面的间接方案(不推荐,需修改对象)
如果必须在数据库层面处理,只能用一些间接手段,但会涉及修改数据库对象:
- 计算列:给需要修改格式的表添加计算列,比如:
但这需要你修改所有查询来使用这个计算列,不符合你「无需修改代码」的需求。ALTER TABLE YourTable ADD FormattedDate AS CONVERT(VARCHAR(10), YourDateColumn, 103) PERSISTED; - 视图封装:把所有包含日期列的表封装成视图,在视图里把日期列转换成指定格式的字符串。同样,这需要修改查询来指向视图,也不符合需求。
关键结论
如果你用的是date、datetime2这类现代日期类型,没有办法在SQL Server服务器端全局修改它们的显示格式而不使用FORMAT/CONVERT——因为它们的默认字符串输出是ISO标准,是固定的。这种情况下,最合理的方案就是在客户端层面处理显示格式。
内容的提问来源于stack exchange,提问作者PRHMN

