SSRS报表中如何将时间字段格式化为12小时制带AM/PM样式
SSRS 24小时制时间转12小时制带AM/PM格式解决方案
你之前调用Format函数报数据集相关错误,核心原因是原表达式使用了First()函数明确指定了MYDATASET数据集作用域,你写的测试表达式直接引用Fields!MY_TIME.Value没有声明作用域,在非该数据集直接绑定的报表项中使用时,会触发作用域不匹配错误。
方案1:修正表达式作用域(改动最小,优先使用)
保留原表达式的前缀和数据集作用域逻辑,把Format逻辑包裹在First聚合外层即可,正确代码如下:
=": " + Format(First(Fields!MY_TIME.Value, "MYDATASET"), "h:mm:ss tt")
格式符说明:
- 小写
h代表12小时制小时计数,不会自动补前导零,下午2点会显示为2而非02,符合你需要的显示效果 tt是上下午标识占位符,会跟随报表区域设置显示对应文本:如果报表Language属性设为zh-CN会显示“上午/下午”,设为en-US会显示AM/PM
如果需要强制输出英文AM/PM标识、不想修改报表全局语言设置,可以使用带区域参数的写法,注意需要提前在报表属性的引用页添加System.Globalization程序集:
=": " + Format(First(Fields!MY_TIME.Value, "MYDATASET"), "h:mm:ss tt", CultureInfo.CreateSpecificCulture("en-US"))
方案2:数据集查询阶段预格式化(适合多位置复用场景)
如果该时间格式需要在报表多个位置重复使用,可以直接在数据集的SQL查询中提前完成格式转换,省去报表层的格式处理逻辑,SQL Server 2012及以上版本可以直接用以下写法:
SELECT -- 其他查询字段, FORMAT(MY_TIME, 'h:mm:ss tt', 'en-US') AS FORMATTED_MY_TIME FROM 你的业务表
后续报表中直接绑定字段即可,不需要额外写格式转换表达式:
=": " + First(Fields!FORMATTED_MY_TIME.Value, "MYDATASET")
常见异常排查
- 如果格式转换后输出不符合预期,先确认
MY_TIME字段是DateTime/Time类型,如果是字符串存储的时间值,需要先用CDate()函数做类型转换再传入Format:CDate(First(Fields!MY_TIME.Value, "MYDATASET")) - 如果输出的12小时制时间小时位带前导零(比如显示
02:31:15 PM),检查格式符是否误写为小写hh,单个小写h才会显示无前导零的12小时制小时数。
内容的提问来源于stack exchange,提问作者Helen Neely
相关产品推荐
相关产品推荐

