使用 datediff 的 SSRS 查找字段中显示不正确的结果错误

SSRS lookup with datediff Incorrect result error showing in fields

这个问题又得写一遍了。我不是 SSRS 方面的专家。 我一直在努力解决这个问题。即使字段都是相同的数据类型,我仍然会在某些字段的字段中收到错误和不正确的时间差。 我不知道做错了什么。这是代码。请在下面找到屏幕截图。

enter code =Datediff(DateInterval.Minute, Fields!health_start_date.Value, Lookup(Fields!flight_date.Value & Fields!register_number.Value &  DATEPART(DateInterval.Hour,Fields!health_start_date.Value) , Fields!FL_DATE.Value & Fields!REG.Value & DatePart(DateInterval.Hour, Fields!ATD.Value), Fields!ATD.Value, "DataSetAIMS") ) MOD 60 & " mins "

这里

场景是 Health start date 和 ATD 这两个字段有两个不同的数据集,它们以不同的方式显示飞行时间,但时差始终以分钟为单位。我想做的是将两个 table 与它们的小时和日期进行比较,使用查找来查找以分钟为单位的差异

好吧,我想我明白了问题所在:你真的很亲密,这东西有时会让我们所有人都绊倒。在 LOOKUP 函数中,我认为您是根据以下条件加入两个数据集:

  • flight_date = FL_DATE,
  • register_number = REG,并且
  • 小时(health_start_date) = 小时(ATD)

这很好,但是和号 (&) 只是 "concatenates" 串在一起,并且 (a) 您的字符串实际上不匹配,并且 (b) HOUR 是一个数字,而不是一个字符串。

(a) 第一个数据集中的"date"是DDMMYYYY,第二个是DDMMYY。即,“05222018”与“052818”不同,因此您的查找将不起作用。它们可能作为日期字段正确存储在数据库中,因此比较会正常工作,但最好强制它们匹配。为此,我建议将每个日期字符串格式化为标准格式,例如 "FormatDateTime(Fields!flight_date.Value, DateFormat.VBShortDate)".

(b) 应该很简单,只要在括号后面加上“.ToString”,比如"DATEPART(DateInterval.Hour,Fields!health_start_date.Value).ToString()".

(c) 我假设 register_number 和 REG 的格式相同。

考虑到所有这些,您的新 LOOKUP 函数可能如下所示:

=Datediff(DateInterval.Minute, 
    Fields!health_start_date.Value, 
    Lookup(
        FormatDateTime(Fields!flight_date.Value, DateFormat.VBShortDate) & Fields!register_number.Value &  DATEPART(DateInterval.Hour,Fields!health_start_date.Value).ToString() , 
        FormatDateTime(Fields!FL_DATE.Value, DateFormat.VBShortDate) & Fields!REG.Value & DatePart(DateInterval.Hour, Fields!ATD.Value).ToString()
        , Fields!ATD.Value
        , "DataSetAIMS") 
        ).ToString() & " minutes"

但是,我认为只要在数据库层、报表查询中进行此类计算,您的生活就会变得更轻松,例如:

SELECT 
    d1.FlightDate
    , d1.RegisterNumber
    , d1.HealthStartDate
    , d2.ATD
    , DiffInMinutes = DATEDIFF(MINUTE, d1.HealthStartDate, d2.ATD)
FROM DataSet1 d1
    JOIN DataSetAIMS d2
        ON CAST(d1.FlightDate AS DATE) = CAST(d2.FL_DATE AS DATE)
        AND d1.register_number = d2.REG
        AND DATEPART(HOUR, d1.health_start_date) = DATEPART(HOUR, d2.ATD)

此代码当然不准确,但希望它能为您指明正确的方向!

谢谢罗素。我已经接受了你的回答。我所做的是从表达式代码中删除格式日期并修改查询设计代码以转换为相同的时间日期:下面的代码

=Datediff(DateInterval.Minute, Fields!health_start_date.Value, Lookup(Fields!register_number.Value & DATEPART(DateInterval.Hour,Fields!health_start_date.Value).ToString() , Fields!REG.Value & DatePart(DateInterval.Hour, Fields!ATD.Value).ToString(), Fields!ATD.Value, "DataSetAIMS") ).ToString() MOD 60 & " mins "

或以下内容也适用:

=Datediff(DateInterval.Minute, 
Fields!health_start_date.Value, 
Lookup(
    Format(Fields!flight_date.Value, "ddMMyy") & Fields!register_number.Value &  DATEPART(DateInterval.Hour,Fields!health_start_date.Value).ToString() , 
    Format(Fields!FL_DATE.Value, "ddMMyy") & Fields!REG.Value & DatePart(DateInterval.Hour,Fields!ATD.Value).ToString()
    , Fields!ATD.Value
    , "DataSetAIMS") 
    ).ToString()  MOD 60 & " minutes