如何在SSRS报表中处理dd-mm-yyyy格式的英式日期字符串?
解决SSRS中dd-mm-yyyy格式字符串转日期类型的问题
我太懂这种明明应该简单却卡壳的感觉了!从SQL拿到nvarchar类型的英式日期字符串(dd-mm-yyyy),在SSRS里转成日期类型确实容易踩坑——毕竟SSRS默认的日期解析逻辑要么偏美式,要么依赖服务器的区域设置,经常掉链子。给你几个亲测有效的解决方案:
方案1:从SQL源头转换(最稳妥)
与其在SSRS里折腾,不如直接在SQL查询时就把字符串转成真正的date类型,这样SSRS拿到的就是标准日期,完全不用再处理。用CONVERT函数指定格式即可:
SELECT CONVERT(date, YourDateColumn, 105) AS FormattedDate FROM YourTable
这里的105是SQL Server里对应dd-mm-yyyy格式的代码,确保转换准确。
方案2:SSRS表达式用DateTime.ParseExact精确解析
如果没办法改SQL查询,就在SSRS的表达式里用精确格式解析,彻底摆脱区域设置的影响:
=DateTime.ParseExact(Fields!YourDateString.Value, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture)
- 注意格式字符串的大小写:
MM代表两位数的月份,mm是分钟,别搞混! InvariantCulture确保不管报表服务器的区域是什么,都严格按你指定的格式解析,不会出现“26/03/2018”因为被当成美式日期而报错的情况。
方案3:加容错处理避免报错
如果你的日期字符串可能存在格式不规范的情况(比如单数字的日/月,或者无效日期),可以用DateTime.TryParseExact做容错,解析失败时返回空值,避免报表直接报错:
=IIF( DateTime.TryParseExact(Fields!YourDateString.Value, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, Nothing), DateTime.ParseExact(Fields!YourDateString.Value, "dd-MM-yyyy", System.Globalization.CultureInfo.InvariantCulture), Nothing )
为啥CDate时灵时不灵?
CDate是依赖系统区域设置的,如果你的报表服务器用的是美式区域(默认MM/dd/yyyy),遇到像“26/03/2018”这种日期,它会把26当成月份,自然解析失败;但如果是“03/05/2018”,它可能会当成3月5日或者5月3日,完全看区域设置,非常不可靠。所以精确指定格式才是正道。
内容的提问来源于stack exchange,提问作者Frostless
相关产品推荐
相关产品推荐

