Sql 从表中查找同一键是否有更接近的日期值

Sql 从表中查找同一键是否有更接近的日期值,sql,sql-server,Sql,Sql Server,我有一个sql表t_accountdetails,其中有一个名为AccountId的帐户列和该帐户的生效日期列。一个帐户可以有多个生效日期。我有一个要求,即获得所有具有非常接近生效日期分录的账户分录。抵销+/-14天 比如说: AccountId:12345有两个条目,生效日期分别为2017年11月12日和2017年18月12日 因此,我的查询应该返回上述情况,即我们输入的生效日期在+/-14天的偏移范围内 请注意,我实际上不是在寻找从今天开始的日期+-14。我正在寻找生效日期,即同一帐户的另一

我有一个sql表t_accountdetails,其中有一个名为AccountId的帐户列和该帐户的生效日期列。一个帐户可以有多个生效日期。我有一个要求,即获得所有具有非常接近生效日期分录的账户分录。抵销+/-14天

比如说:

AccountId:12345有两个条目,生效日期分别为2017年11月12日和2017年18月12日

因此,我的查询应该返回上述情况,即我们输入的生效日期在+/-14天的偏移范围内


请注意,我实际上不是在寻找从今天开始的日期+-14。我正在寻找生效日期,即同一帐户的另一个生效日期的+/-14天

您可以使用该功能使其正常工作

select * from t_accountdetails where AccountId = 12345 and effectiveDate >= DATEADD(day, -14, getdate()) and effectiveDate <= DATEADD(day, 14, getdate())
这将返回AccountID=12345且生效日期介于今天-14天和今天+14天之间的所有记录。 注意:如果有多个记录符合条件,则将返回所有匹配的记录。

您希望所有记录在14天内的另一个生效日期内存在,因此请使用存在的位置:


我倾向于使用滞后和超前:


将此版本的性能与现有版本的性能进行比较,并在t\u accountdetailsaccountid、生效日期上建立索引,这将非常有趣。

重复问题。请检查我实际上没有寻找从今天开始的日期+-14。我正在寻找生效日期,即同一账户的另一个生效日期的+/-14天。我不好,我当时理解错误。托尔斯滕·凯特纳的答案应该是你想要的。我其实不是在寻找今天开始的+14号约会。我正在寻找生效日期,即同一账户的另一个生效日期的+/-14天是的,这就是我的查询所做的。你认为它为什么要处理今天的问题?它将一条记录的日期t.effective_date与另一条记录的日期other.effective_date进行比较。我的表中没有名为id的字段。ur查询有other.id t.id如果生效日期为2012年1月1日和2013年1月1日,且不在+/-14天内,则上述查询返回原始值。我使用id作为记录的标识符,以便仅查看其他记录,而不将记录与自身进行比较。将其替换为表的ID。如果没有,则可以使用生效日期,但如果可能的话,将不再检测具有相同生效日期的两条记录。如果生效日期为2012年1月1日和2013年1月1日,且不在+/-14范围内,则上述查询将返回原始数据days@user2081126 . . . 没有样本数据,我处于某种劣势。但这应该只返回14天内任何一个方向上另一行的行。
select *
from t_accountdetails t
where exists
(
  select *
  from t_accountdetails other
  where other.accountid = t.accountid
  and other.id <> t.id
  and abs(datediff(day, other.effective_date, t.effective_date)) <= 14
)
order by accountid, effective_date;
select ad.*
from (select ad.*,
             lag(effective_date) over (partition by accountid order by effective_date) as prev_ed,
             lead(effective_date) over (partition by accountid order by effective_date) as next_ed
      from t_accountdetails ad
     ) ad
where effective_date <= dateadd(day, 14, prev_ed) or
      effective_date >= dateadd(day, -14, next_ed);