我使用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数据集给出了以下结果。 (见附件示例。忽略名人姓名)
我的意图是主数据集应该从AgentID列获取ID,将它们排列在逗号分隔的字符串中,并将其排除在总班次小时之外。
编辑2:
我想我修好了。我要做一些测试来检查结果。我将主数据集中的代码更改为:
AND (AgentID NOT IN (@AgentName,'1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') OR ISNULL(AgentID,'') = '')
答案 0 :(得分:0)
你提到了:
然后我将所有代理商加起来&#39;获得总班次的秒数(以秒为单位) 那天。
问题:
无论我从下拉菜单中选择哪些代理商,我的总班次 小时数保持不变。
根据您的说明,total shift
是该特定日期的静态值。
第一次更新:
尝试从UDF中将数据类型从int
更改为bigint
,以防数据溢出发生