SQL 2014,SSRS - 使用参数进行时间计算会产生错误和错误的计算

时间:2017-03-24 18:16:36

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

我使用Visual Studio报告了我们中心的代理统计数据。在报告中是用于选择报告日期的参数,另一个用于从报告统计信息中选择代理到EXCLUDE。

表中的数据具有登录时间和注销时间。我做了datediff以秒为单位获得总登录时间。然后我将所有代理商加起来'获得当天的总班次(以秒为单位)的秒数。 我创建了一个将秒数转换为hh:mm:ss的函数。

问题:
无论我从下拉列表中选择哪些代理商,我的总班次都保持不变。

我创建的功能

CREATE FUNCTION [dbo].[UDF_SecondsToHHMMSS_VarChar](@Seconds int) RETURNS varchar(20) AS
BEGIN
    RETURN (
             SELECT CONVERT(VARCHAR(20), @Seconds / 3600) + ':' 
           + RIGHT('00' + CONVERT(VARCHAR(2), (@Seconds % 3600) / 60) ,2) + ':' 
           + RIGHT('00' + CONVERT(VARCHAR(2), @Seconds%60), 2) AS [HMS] 
           )
END

GO

作为主数据集的一部分进行查询:

,(SELECT [UDF_SecondsToHHMMSS_VarChar](SUM (DATEDIFF(second, AgentLoginTime, AgentLogoutTime)))
      FROM     [AgentStats]
      WHERE    DATEADD(dd, 0, DATEDIFF(dd, 0, MidnightStartDate)) = CAST(@S AS DATETIME) 
        AND (AgentID NOT IN (@AgentName) OR ISNULL(AgentID,'') = '')
                  )[Actual Shift Hrs]
-- I used a GROUP BY later to calculate the SUM

我创建了另一个数据集,用于将代理名称从统计信息中提取到EXCLUDE。当没有要排除的代理时,我使用Union添加虚拟行(我将其设置为默认值)。

该数据集为:

SELECT DISTINCT AgentID, AgentFirstName + ' ' + AgentLastName [AgentName]

FROM AgentStats

WHERE MidnightStartDate >= dateadd(day, -60, getdate())
  AND MidnightStartDate <  getdate()
  AND AgentID NOT IN ('1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') -- These agents permanently excluded

UNION

SELECT '100', 'No Agents'  -- This is default if there are no agents to select from drop-down

ORDER BY [AgentName];

我已设置参数以选择报告的日期,另一个用于选择要从多选下拉列表中排除的代理。

对于AgentName参数,我选择了相关数据集并选择了AgentID作为Value字段,并选择了AgentName作为Label字段。

我不确定为什么主查询没有从AgentName参数中选择AgentID。

我做错了什么?

编辑1:
作为查询单独运行时,我的AgentName数据集给出了以下结果。 (见附件示例。忽略名人姓名)
enter image description here

我的意图是主数据集应该从AgentID列获取ID,将它们排列在逗号分隔的字符串中,并将其排除在总班次小时之外。

编辑2:
我想我修好了。我要做一些测试来检查结果。我将主数据集中的代码更改为:

AND (AgentID NOT IN (@AgentName,'1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') OR ISNULL(AgentID,'') = '')

1 个答案:

答案 0 :(得分:0)

你提到了:

  

然后我将所有代理商加起来&#39;获得总班次的秒数(以秒为单位)   那天。

问题:

  

无论我从下拉菜单中选择哪些代理商,我的总班次   小时数保持不变。

根据您的说明,total shift是该特定日期的静态值。

第一次更新: 尝试从UDF中将数据类型从int更改为bigint,以防数据溢出发生