2017-03-24 57 views
0

我使用Visual Studio在我们的中心计算了代理状态的报告。在报告中是用于选择报告日期的参数,另一个用于从报告统计中选择要排除的代理。SQL 2014,SSRS - 使用参数计算时间给出错误和错误计算

表中的数据具有登录时间和注销时间。我做了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 

我创造了另一个数据集拉起代理名称从统计来排除。当没有要排除的代理时,我使用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

我的意图是,主数据集应采取的ID从AGENTID列,以逗号分隔字符串排列并排除那些从合计移动小时。

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

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

你能只是张贴整个查询....这是非常混乱试图拼凑一切一起。 – scsimon

+0

AND(AgentID NOT IN(@AgentName)or ...这部分几乎肯定是错误的,除非@AgentName实际上是AgentID,并且是一个以逗号分隔并带引号的列表,它是传递给这个参数的实际值是什么? – scsimon

+0

他是解析'@ AgentName'的'AgentID'值字段 – LONG

回答

0

你提到:

然后我加起来所有代理秒获得总移(单位为秒) 的那一天。

问题:

无论我从下拉列表中选择哪些代理,我合计移动 小时保持不变。

total shift是根据您的描述该特定的一天的静态值。

1日更新: 尝试从UDF改变来自int数据类型bigint柜面数据溢出发生

+0

这怎么可能与代理有所不同代理? – LONG

+0

实际轮班时间应该加起来代理NOT IN的小时数(从参数下拉列表中选择的代理列表)我在那里做错了什么? – user1777929

+0

代理下拉列表的数据集似乎是正确的,我是现在看看主要的一个 – LONG