使用datediff进行SSRS查找在字段中显示错误的结果错误

时间:2018-05-21 15:45:22

标签: sql sql-server reporting-services ssrs-2012

我必须再次写这个问题。我不是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 "

这里

情景是健康开始日期和ATD这两个字段有两个不同的数据集,它们以不同的方式显示飞行时间,但时间差总是以分钟为单位。我要做的是将两个表与他们的小时和日期进行比较,使用查找来查找分钟差异This is the first dataset table

This is DataSetAIMS table

2 个答案:

答案 0 :(得分:1)

好吧,我认为我看到了问题:你真的很接近,这些东西偶尔让我们吵闹。在LOOKUP函数中,我认为您将基于以下内容加入两个数据集:

  • flight_date = FL_DATE,
  • register_number = REG,和
  • HOUR(health_start_date)= HOUR(ATD)

哪个好,但&符号(&)只是"连接"串起来,和(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)

这段代码当然不是很准确,但希望它会让你指向正确的方向!

答案 1 :(得分:1)

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

=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