SQL Server合计行日期字段传空显示1900/1/1如何设置显示空白
问题根源
UNION ALL拼接多结果集时,SQL Server会以第一个SELECT语句返回的字段数据类型为准,对后续所有SELECT同位置的字段做隐式类型转换。你写的合计行里给日期字段位置赋值的空字符串' '是字符类型,会被强制转换成对应位置的日期类型,而SQL Server中隐式转换空字符串为日期时,默认返回日期类型的基准值1900-01-01,就出现了你看到的误导性显示。
解决方案
核心逻辑是统一上下两个结果集同位置字段的数据类型:把明细查询里所有日期类型的字段,显式转换成和你显示格式匹配的字符串类型,这样合计行的空字符串就不会被强制转成日期,就能正常显示空白。
修正后的代码参考
-- 原明细查询部分:所有日期类型字段显式转为字符串 SELECT AddUpdate, Members_SourceCode, YearMonth, -- 如果该字段是日期类型,也按下方规则转成字符串 -- 以下所有原本是日期类型的字段,都用CONVERT转成对应格式的字符串 CONVERT(VARCHAR(10), 第一个日期字段名, 23) AS 第一个日期字段名, -- 格式码23对应yyyy-mm-dd,可按需替换 CONVERT(VARCHAR(10), 第二个日期字段名, 23) AS 第二个日期字段名, CONVERT(VARCHAR(10), 第三个日期字段名, 23) AS 第三个日期字段名, -- 其余非日期字段保持原有写法即可 其他非日期字段 FROM 你的业务表 -- 原明细查询的筛选、关联逻辑保持不变 UNION ALL SELECT AddUpdate, Members_SourceCode, YearMonth + ' Total Month', '', -- 此处空字符串不会再被转成1900-01-01,会正常显示空白 '', '', '', '', '', '', '', '', '', '', '', COUNT(Members_sourceCode) -- 原合计查询的表、分组逻辑保持不变 GROUP BY AddUpdate, Members_SourceCode, YearMonth ORDER BY AddUpdate, Members_SourceCode, YearMonth
注意事项
- 不建议直接给合计行日期位置赋值
NULL,除非你用的报表/查询工具配置了NULL显示为空白,否则结果会直接显示NULL文本,可读性更差 - 日期转字符串的格式码可以根据你需要的显示效果调整:比如需要
yyyy/mm/dd格式用格式码111,需要带时分秒就转成VARCHAR(19)搭配对应格式码,保证和你原来明细行的日期显示效果完全一致即可 - 转字符串时给的VARCHAR长度要足够容纳日期文本,避免内容截断,普通短日期用
VARCHAR(10)、带时分秒的日期用VARCHAR(19)足够覆盖绝大多数场景
内容的提问来源于stack exchange,提问作者MYTWO
相关产品推荐
相关产品推荐

