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 - 使用参数的时间计算给出错误和错误的计算的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rs参数表达式条件

需要解释将 s-s-rS 多值参数传递给 SQL 的工作原理

s-s-rS 13 (SQL 2016) 报告缓存问题

为啥 s-s-rS 在已经定义时要求定义查询参数?

s-s-rS 有条件地运行 SQL/DataSet

带参数的 s-s-rS 中的 Exec Base 过程