MSSQL Server执行Select *时如何统一设置所有日期字段输出格式
MSSQL Server
SELECT * 全局统一日期输出格式解答 核心结论
MSSQL 原生不支持在 SELECT * 查询场景下直接强制所有日期字段统一输出格式,底层逻辑如下:
- 日期类字段(
date/datetime/datetime2/smalldatetime等)属于二进制存储的数值类型,本身不存在固定的存储格式,只有在转换为字符串类型输出时才会涉及格式化规则 SELECT *默认返回字段的原生数据类型,最终的日期展示格式由接收查询结果的客户端(比如SSMS、业务应用代码)决定,而非SQL Server服务端控制
可行实现方案
方案1:调整客户端展示格式(最简便,无需修改查询语句)
如果仅需要在查看结果时展示为CCYY-MM-DD格式,直接修改客户端配置即可,不需要调整SQL逻辑:
- 若使用SSMS查看结果:打开「工具」→「选项」→「查询结果」→「SQL Server」,分别修改「以文本格式显示结果」和「以网格格式显示结果」中的日期格式配置为
yyyy-MM-dd,配置生效后所有SELECT *返回的日期字段都会按目标格式展示 - 若在业务应用中接收查询结果:直接在应用层统一配置日期序列化规则为
yyyy-MM-dd即可,是生产环境的最优选择
方案2:动态SQL自动生成带格式化的查询语句(无需手动枚举所有列)
如果必须在SQL服务端直接返回格式化后的字符串类型日期值,不需要手动逐个指定列名,可以用动态SQL自动拼接查询语句,示例代码如下:
DECLARE @TargetTableName SYSNAME = '替换为你要查询的表名' DECLARE @QuerySql NVARCHAR(MAX) -- 自动拼接字段,日期类字段统一转成yyyy-MM-dd格式 SELECT @QuerySql = COALESCE(@QuerySql + ', ', 'SELECT ') + CASE WHEN t.name IN ('date', 'datetime', 'datetime2', 'smalldatetime', 'datetimeoffset') THEN 'CONVERT(VARCHAR(10), ' + QUOTENAME(c.name) + ', 23) AS ' + QUOTENAME(c.name) ELSE QUOTENAME(c.name) END FROM sys.columns c INNER JOIN sys.types t ON c.system_type_id = t.system_type_id WHERE c.object_id = OBJECT_ID(@TargetTableName) ORDER BY c.column_id SET @QuerySql = @QuerySql + ' FROM ' + QUOTENAME(@TargetTableName) -- 执行最终生成的查询 EXEC sp_executesql @QuerySql
说明:代码中
CONVERT函数的第三个参数23是SQL Server内置的格式码,对应输出格式就是yyyy-MM-dd(即要求的CCYY-MM-DD),输出长度固定为10字符,完全匹配需求。
注意事项
- 生产环境不建议滥用动态SQL方案,日期格式化属于展示层逻辑,放到应用端处理更合理,也不会损失日期类型的原生操作能力
- 动态SQL方案仅推荐用于临时查询场景,避免手动枚举大量列名的麻烦
内容的提问来源于stack exchange,提问作者Tan Rezaei
相关产品推荐
相关产品推荐

