SSRS比较表达式中的日期

时间:2016-08-22 10:22:08

标签: sql reporting-services reporting

我有一些基本的表达方式来突出显示某些字段:

=IIF(Fields!Failure.Value > 0, "Red", "Transparent")

但是,我有另一个字段,其中包含以下格式的日期:

22/08/2016 22/08/2016 - each field can contain multiple dates. 

它作为VARCHAR存储在SQL中。

我需要在报告中运行类似的表达式来实现以下目标:

如果日期比报告运行日期早1天,请突出显示该字段。如果日期大于1天,请将该字段突出显示不同的颜色。

我熟悉基本表达式,但我想不出一个简单的方法来获取当前日期,然后在两者之间进行比较。

2 个答案:

答案 0 :(得分:1)

您可以使用“分割”功能生成值数组。当然,您仍然需要选择其中一个进行测试。以下内容可能会让您重新开始。

=Iif(
    CDate(
        Split(
            "21/08/2016, 22/08/2016",
            ","
        ).GetValue(0)
    ) < Today,
    "True",
    "False"
)

但是,如果您正在处理可以包含任意数量日期的日期字符串,并且您要测试所有日期字符串,那么简单的SSRS表达式将无法处理该日期字符串。幸运的是,我们可以使用一些自定义代码。

右键单击报告背景,然后选择报告属性。点击“代码”项,然后将以下内容粘贴到代码框

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

答案 1 :(得分:1)

正如其他人所说,你真的不应该使用这样的黑客......

但是,这应该适合你:

window.location.href.split('.')[0].split('//')[1];

基本上,删除连接字符(在本例中为空格),然后以给定格式替换当前日期的所有实例。如果剩下任何字符,则您的日期与今天不匹配。然后取出该值并重复昨天的任何实例。

显然,如果您的日期格式发生变化,这将会失败。
但是你已经知道将日期比作字符串是一个坏主意,对吧......