SQL 2014,s-s-rS - 使用参数的时间计算给出错误和错误的计算
Posted
技术标签:
【中文标题】SQL 2014,s-s-rS - 使用参数的时间计算给出错误和错误的计算【英文标题】:SQL 2014, s-s-rS - Time calculation using parameter gives error and wrong calculation 【发布时间】:2017-03-24 18:16:35 【问题描述】:我使用 Visual Studio 制作了一份报告来计算我们中心的代理统计数据。报告中有用于选择报告日期的参数,以及用于从报告统计信息中选择要排除的代理的参数。
表中的数据有登录次数和注销次数。我做了一个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 数据集作为查询单独运行时会给出以下结果。 (见附件示例。忽略名人姓名)
我的意图是主数据集应该从 AgentID 列中获取 ID,将它们排列在逗号分隔的字符串中,并将它们排除在总轮班时间之外。
编辑 2: 我想我修好了。我将做一些测试来检查结果。我将主数据集中的代码更改为:
AND (AgentID NOT IN (@AgentName,'1067', '1050', '1150', '1052', '1161', '1158', '1063', '1173', '1101', '1128', '1165') OR ISNULL(AgentID,'') = '')
【问题讨论】:
你能把整个查询贴出来吗....试图把它们拼凑在一起是非常令人困惑的。 AND (AgentID NOT IN (@AgentName) or... 这部分几乎肯定是错误的。除非@AgentName 实际上是 AgentID 并且是逗号分隔和引用的列表。传递的实际值是什么进入这个参数? 他正在为@AgentName
值字段解析AgentID
是的。 AgentID 将用逗号分隔并进入@AgentName。例如;不在('1120'、'1121'、'1122')
【参考方案1】:
你提到:
然后我将所有代理的秒数相加得到总班次(以秒为单位) 那天。
问题:
无论我从下拉列表中选择哪个代理,我的总班次 小时数保持不变。
total shift
是基于您的描述的特定日期的静态值。
第一次更新:
尝试将 UDF 中的数据类型从 int
更改为 bigint
,以防发生数据溢出
【讨论】:
这怎么会因代理而异? 实际轮班时间应该加起来代理不在的小时数(从参数下拉列表中选择的代理列表)我在那里做错了吗? 代理下拉列表的数据集似乎正确,我现在正在查看主要的数据集 @user1777929 你能试着把你的UDF的数据类型从int
改成bigint
吗?
谢谢@LONG。我将数据类型更改为“bigint”并执行了 UDF。时间仍然没有改变。 >>> 我认为 UDF 不是问题,因为它可以将秒数转换为 hh:mm:ss。我认为这是主数据集中的查询存在问题,因为它不操作查询中的 NOT IN 部分。 >>> 那个或数据集来拉出代理列表。以上是关于SQL 2014,s-s-rS - 使用参数的时间计算给出错误和错误的计算的主要内容,如果未能解决你的问题,请参考以下文章