SSRS 比较表达式中的日期
SSRS comparing dates in an expression
我有一些基本的表达式来突出显示某些字段:
=IIF(Fields!Failure.Value > 0, "Red", "Transparent")
但是,我有另一个字段包含以下格式的日期:
22/08/2016 22/08/2016 - each field can contain multiple dates.
这作为 VARCHAR 存储在 SQL 中。
我需要在我的报告中运行一个类似的表达式来实现以下目的:
如果日期比报告日期早 1 天 运行,请突出显示该字段。如果日期早于 1 天以上,则用不同的颜色突出显示该字段。
我#m 熟悉基本表达式,但我想不出一种简单的方法来获取当前日期,然后比较两者。
您可以使用 Split 函数生成值数组。当然,您仍然需要 select 其中之一进行测试。以下内容可能会让您重新开始。
=Iif(
CDate(
Split(
"21/08/2016, 22/08/2016",
","
).GetValue(0)
) < Today,
"True",
"False"
)
但是,如果您处理的日期字符串可以包含任意数量的日期并且您要测试所有日期,那么简单的 SSRS 表达式将无法处理。幸运的是我们可以使用一些自定义代码。
右键单击报表背景和 select 报表属性。单击 'Code' 项并将以下内容粘贴到代码框
Public Function TestDate(DateString As String) As String
Dim DatesArray() As String = Split(DateString)
Dim ReturnValue As String = "Transparent"
For Each d As String In DatesArray
If Date.Parse(d) = DateAdd(DateInterval.Day, -1, Date.Today) Then
ReturnValue = "Red"
End If
If Date.Parse(d) < DateAdd(DateInterval.Day, -1, Date.Today) Then
ReturnValue = "DarkRed"
End If
Next
Return ReturnValue
End Function
现在将表达式更改如下
=Code.TestDate("21/08/2016 22/08/2016")
我在 VB 中使用了 Date.Today 来限制日期与当天的比较。如果您想更精确,即:确切时间,请使用 Date.Now 而不是
正如其他人所说,您真的不应该使用这样的技巧...
但是,这应该适合你:
=iif(Len(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),"")) = 0, "Transparent" ,iif(Len(Replace(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),""), Format(Today().AddDays(-1), "dd/MM/yyyy"),"")) = 0, "Green", "Red"))
本质上,删除连接字符(在本例中为 space),然后以给定格式替换当前日期的所有实例。如果还有任何字符剩余,则您的日期与今天不匹配。然后取该值并重复昨天的任何实例。
显然,如果您的日期格式发生变化,这将会下降。
但是你已经知道将日期作为字符串进行比较是一个坏主意,对吧...
我有一些基本的表达式来突出显示某些字段:
=IIF(Fields!Failure.Value > 0, "Red", "Transparent")
但是,我有另一个字段包含以下格式的日期:
22/08/2016 22/08/2016 - each field can contain multiple dates.
这作为 VARCHAR 存储在 SQL 中。
我需要在我的报告中运行一个类似的表达式来实现以下目的:
如果日期比报告日期早 1 天 运行,请突出显示该字段。如果日期早于 1 天以上,则用不同的颜色突出显示该字段。
我#m 熟悉基本表达式,但我想不出一种简单的方法来获取当前日期,然后比较两者。
您可以使用 Split 函数生成值数组。当然,您仍然需要 select 其中之一进行测试。以下内容可能会让您重新开始。
=Iif(
CDate(
Split(
"21/08/2016, 22/08/2016",
","
).GetValue(0)
) < Today,
"True",
"False"
)
但是,如果您处理的日期字符串可以包含任意数量的日期并且您要测试所有日期,那么简单的 SSRS 表达式将无法处理。幸运的是我们可以使用一些自定义代码。
右键单击报表背景和 select 报表属性。单击 'Code' 项并将以下内容粘贴到代码框
Public Function TestDate(DateString As String) As String
Dim DatesArray() As String = Split(DateString)
Dim ReturnValue As String = "Transparent"
For Each d As String In DatesArray
If Date.Parse(d) = DateAdd(DateInterval.Day, -1, Date.Today) Then
ReturnValue = "Red"
End If
If Date.Parse(d) < DateAdd(DateInterval.Day, -1, Date.Today) Then
ReturnValue = "DarkRed"
End If
Next
Return ReturnValue
End Function
现在将表达式更改如下
=Code.TestDate("21/08/2016 22/08/2016")
我在 VB 中使用了 Date.Today 来限制日期与当天的比较。如果您想更精确,即:确切时间,请使用 Date.Now 而不是
正如其他人所说,您真的不应该使用这样的技巧...
但是,这应该适合你:
=iif(Len(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),"")) = 0, "Transparent" ,iif(Len(Replace(Replace(Replace(Fields!DateField.Value," ",""), Format(Today, "dd/MM/yyyy"),""), Format(Today().AddDays(-1), "dd/MM/yyyy"),"")) = 0, "Green", "Red"))
本质上,删除连接字符(在本例中为 space),然后以给定格式替换当前日期的所有实例。如果还有任何字符剩余,则您的日期与今天不匹配。然后取该值并重复昨天的任何实例。
显然,如果您的日期格式发生变化,这将会下降。
但是你已经知道将日期作为字符串进行比较是一个坏主意,对吧...