排除21天窗口过滤器故障

时间:2017-08-24 14:09:35

标签: sql sql-server

我有一个每天运行的工作,用于查找标记有特定状态代码的帐户。这个想法是帐户在21天内保持相同的状态标记。我们最近发现了一种语法缺陷,它允许21天前标记的帐户具有适当的状态,然后在结果集中选择后标记为不同的状态。我试图纠正这个缺陷,但结果还不是100%正确。经过多次故障排除后,我确信只有查询中的日期过滤器稍微关闭,因此我只发布查询的那部分以消除分心。

这是最初的21天过滤器:

WHERE (([StatusHistory].[DateChanged] >= DATEADD(DAY, -20, { fn CURDATE() })  
AND [StatusHistory].[DateChanged] < DATEADD(DAY, 1, DATEADD(DAY, -20, { fn CURDATE() }))) 

我将其修改为:

WHERE (([StatusHistory].[DateChanged] >= DATEADD(DAY, -20, { fn CURDATE() })  
AND [StatusHistory].[DateChanged] < DATEADD(DAY, 1, DATEADD(DAY, -20, { fn CURDATE() })))
AND master.number NOT IN 
                (SELECT accountid FROM StatusHistory with (nolock)
                WHERE NewStatus NOT IN ('NSF','DCL') 
                AND DATEDIFF(d, datechanged, getdate()) < 21)

此修改为我提供了99%的正确结果,但未能提取应该包含在结果集中的一个帐户。我唯一可以推测的是,一天中的时间会以某种方式发挥作用。我确实在一天的时间之后运行了这个查询,帐户最初被标记为正确的状态(在这种情况下是下午3:38)并且仍然没有正确拉动。我真的很感激任何人都能深入了解如何调整它以反映执行时正确的21天窗口。

2 个答案:

答案 0 :(得分:0)

也许这已经过度简化但不会有效吗?

-- Group by statuses by accountid for the last 20 days and then count them
-- Report if more than one status
select accountid
from
(
    select  distinct accountid, NewStatus
    from StatusHistory
    where DateChanged >= DATEADD(day,-20,CAST(getdate() as DATE))
)q
group by accountid
having count(*) > 1

TEST:http://rextester.com/SYCXK56222

答案 1 :(得分:0)

使用Tab Alleman的建议,我使用所有getdate()或所有curdate()进行了测试。经过几周的日常测试后,使用所有curdate()证明是正确的解决方案。感谢协助Tab!

    WHERE (([StatusHistory].[DateChanged] >= DATEADD(DAY, -20, { fn 
    CURDATE() })  
    AND [StatusHistory].[DateChanged] < DATEADD(DAY, 1, DATEADD(DAY, -20, { 
    fn CURDATE() }))) 
    AND master.number NOT IN 
            (SELECT accountid FROM StatusHistory with (nolock)
            WHERE NewStatus NOT IN ('NSF','DCL') 
            AND DATEDIFF(d, datechanged, { fn CURDATE() }) < 21)