Sql server SSRS中的格式日期时间异常

Sql server SSRS中的格式日期时间异常,sql-server,datetime,reporting-services,ssrs-2012,Sql Server,Datetime,Reporting Services,Ssrs 2012,我已经构建了一份SSRS报告,该报告结合了两列int数据(即:6和2017),以使用以下语句在SSRS报告的一列(即:2017年6月)中形成有效的月份和年份结果:格式(CDate(Fields!monthhernedId.Value&“/”&Fields!yearEnowned.Value) 这符合要求,但该月的某些int值为13,应代表一年中的所有月份,因此报告中这些值所需的格式为“all 2017”。我认为像下面这样的IIF语句会指定排除所需的格式,但是月值为13的行只会显示#error。任

我已经构建了一份SSRS报告,该报告结合了两列int数据(即:6和2017),以使用以下语句在SSRS报告的一列(即:2017年6月)中形成有效的月份和年份结果:
格式(CDate(Fields!monthhernedId.Value&“/”&Fields!yearEnowned.Value)

这符合要求,但该月的某些int值为13,应代表一年中的所有月份,因此报告中这些值所需的格式为“all 2017”。我认为像下面这样的IIF语句会指定排除所需的格式,但是月值为13的行只会显示#error。任何建议都将不胜感激

=iif(Fields!MonthEarnedId.Value < 13, Format(CDate(Fields!MonthEarnedId.Value & "/" & Fields!YearEarned.Value), "MMM yyyy"), "All " & Fields!YearEarned.Value)
=iif(字段!MonthHearnedId.Value<13,格式为(CDate(字段!MonthHearnedId.Value&“/”&Fields!YearEarned.Value),“MMM yyyy”),“All”&字段!YearEarned.Value)

如果要将该字段类型强制转换为日期变量以应用格式,还需要将列的数据类型从string更改为datetime。当呈现程序尝试强制转换字符串值“All 2017”时,会发生错误要解决这个问题,您需要使用
CStr()
或其他方法将其转换回字符串子类型

=iif(Fields!MonthEarnedId.Value < 13, CStr(Format(CDate(Fields!MonthEarnedId.Value & "/" & Fields!YearEarned.Value), "MMM yyyy")), "All " & Fields!YearEarned.Value)
=iif(字段!MonthHearnedId.Value<13,CStr(格式为CDate(字段!MonthHearnedId.Value&“/”&Fields!YearEarned.Value),“MMM yyyy”),“所有”和字段!YearEarned.Value)

表达式中的问题是
CDate()
13
发生时。根据SSRS中的设计,
IIF
计算
TRUE
FALSE
,在您的情况下,当13被选择为
monthhernedid
然后
CDate()
尝试以
MMM yyyy
格式转换
13/2017
,该格式无效并引发
#错误

我建议您在SQL查询中将
int
转换为
month names
,并将数据连接到SSRS中,但如果您必须严格在SSRS中执行此操作,则以下是您必须输入的表达式

=SWITCH(Fields!MonthEarnedId.Value=1,"Jan"
,Fields!MonthEarnedId.Value=2,"Feb"
,Fields!MonthEarnedId.Value=3,"Mar"
,Fields!MonthEarnedId.Value=4,"Apr"
,Fields!MonthEarnedId.Value=5,"May"
,Fields!MonthEarnedId.Value=6,"Jun"
,Fields!MonthEarnedId.Value=7,"Jul"
,Fields!MonthEarnedId.Value=8,"Aug"
,Fields!MonthEarnedId.Value=9,"Sep"
,Fields!MonthEarnedId.Value=10,"Oct"
,Fields!MonthEarnedId.Value=11,"Nov"
,Fields!MonthEarnedId.Value=12,"Dec"
,Fields!MonthEarnedId.Value=13,"All"
) & " " & CStr(Fields!YearEarned.Value.Value)

您提供的可见性代码是一个有效的解决方案,但是在运行报告时效率非常低。因此,我采纳了您的建议,决定将日期格式化为SQL查询中的一个字段,即:当MonthHearnedId<13时为CASE,然后将(CAST(CONCAT(monthHearnedId,/1/',yearEnowed)格式化为datetime),'MMM yyyy')其他“全部”+年结束时为MonthHearn