Sql 每24个月完成一次培训检查

Sql 每24个月完成一次培训检查,sql,sql-server,Sql,Sql Server,我正在尝试找出正确的查询,以检查用户自开始工作以来是否每24个月完成一次特定的培训类型。用户需要每24个月完成一次特定的培训 SELECT userid, completiondate FROM trainingevent INNER JOIN emplpoyment e ON e.userid = trainingevent.userid WHERE userid = 1007 AND trainingtype = 5 案例

我正在尝试找出正确的查询,以检查用户自开始工作以来是否每24个月完成一次特定的培训类型。用户需要每24个月完成一次特定的培训

    SELECT userid, completiondate 
      FROM trainingevent 
INNER JOIN emplpoyment e 
        ON e.userid = trainingevent.userid
     WHERE userid = 1007 
       AND trainingtype = 5
案例1:假设雇佣开始日期为2017年5月15日,那么如果该培训类型在2017年5月15日至2019年5月15日之间的任何时间完成,则用户应显示完成日期

案例2:假设雇佣开始日期为2017年5月15日,那么如果该培训类型在2019年5月15日至2021年5月15日之间的任何时间完成,则用户应显示完成日期

预期结果应该是:如果用户完成了培训

1007 5/15/2018
1007 NULL
预期结果应该是:如果用户没有完成培训

1007 5/15/2018
1007 NULL

我认为这也需要一些汇总,因为我认为员工可能会根据OP的描述进行多次培训。也许是这样的

SELECT e.userid,
       MAX(CASE WHEN te.completiondate > DATEADD(MONTH, -24, GETDATE()) THEN te.completiondate END)
FROM dbo.employment e
     LEFT JOIN dbo.trainingevent te ON e.userid = te.userid
                                   AND te.trainingtype = 5
WHERE e.userid = 1007
GROUP BY e.userid;

如果我理解正确,您只关心过去24个月内完成的培训日期。这是
应用的一个很好的用例:

SELECT e.userid, te.completiondate
FROM dbo.employment e OUTER APPLY
     (SELECT TOP (1) MAX(te.completiondate) as completiondate
      FROM dbo.trainingevent te 
      WHERE e.userid = te.userid AND
            te.trainingtype = 5 AND
            te.completiondate > DATEADD(MONTH, -24, GETDATE())
     ) te
WHERE e.userid = 1007
GROUP BY e.userid;

那么为什么你所拥有的东西不能像你期望的那样发挥作用呢?@Larnu我仍然缺少另一个条件来检查是否有培训,培训的完成日期是从雇佣开始日期算起的24个月,所以你只想在不在24个月内的时候取消日期
选择userid,当datediff(month,completiondate,getdate())小于25时,选择case,然后选择completiondate,否则将null结束为来自trainingevent的completiondate…
您可以尝试类似于
。。。其中DATEADD(month,-24,GETDATE())>completiondate
您不关心雇佣开始日期,只关心他们在过去24个月的某个时间完成了培训。这就是为什么西蒙的解决方案会对你有用的原因。戈登不是这样。他说,查询必须检查自开始就业以来每24个月是否完成一次培训,并且在不参考就业开始日期的情况下,无法确定任何培训是在哪个时期完成的。我还对他的问题发表了评论,建议保留每个时期的周年纪念日,两个时期之间的间隔可能超过24个月——我可以想到两个案例(在英国这里)遵循这一逻辑:MOTs(定期车辆测试)和驾驶员CPC(职业驾驶员的一种驾驶权利)。