Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008-日期差异_Sql_Sql Server 2008 R2 - Fatal编程技术网

SQL Server 2008-日期差异

SQL Server 2008-日期差异,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,这是一些数据的一个示例 id CurrentMailPromoDate 1 1/1/2013 2 3/1/2013 3 6/9/2013 4 6/10/2013 5 9/18/2013 6 12/27/2013 7 12/27/2013 我需要的是只提取那些当前记录和前一记录之间的日期差>=100的id 换句话说,结果集将是: id CurrentMailPromoDate 1 1/1/2013 **initial record** 3

这是一些数据的一个示例

id  CurrentMailPromoDate
1   1/1/2013
2   3/1/2013
3   6/9/2013
4   6/10/2013
5   9/18/2013
6   12/27/2013
7   12/27/2013
我需要的是只提取那些当前记录和前一记录之间的日期差>=100的id

换句话说,结果集将是:

id  CurrentMailPromoDate    
1   1/1/2013      **initial record**
3   6/9/2013    
5   9/18/2013   
6   12/27/2013  
7   12/27/2013  

挑战在于获得之前的日期。在SQL Server 2012中,您可以使用lag,但SQL Server 2008不支持此功能。相反,我使用相关子查询来获取上一个日期

下面返回您要查找的集合:

with t as (
      select 1 as id, CAST('2013-01-01' as DATE) as CurrentMailPromoDate union all
      select 2, '2013-03-01' union all
      select 3, '2013-06-09' union all
      select 4, '2013-06-10' union all
      select 5, '2013-09-18' union all
      select 6, '2013-12-27' union all
      select 7, '2013-12-27')
select t.id, t.CurrentMailPromoDate
from (select t.*,
             (select top 1 CurrentMailPromoDate
              from t t2
              where t2.CurrentMailPromoDate < t.CurrentMailPromoDate
              order by CurrentMailPromoDate desc
             ) as prevDate
      from t
     ) t
where DATEDIFF(dd, prevDate, CurrentMailPromoDate) >= 100 or prevDate is null;
编辑:

子查询返回每个记录的上一个日期。对于给定的记录,它将查看所有小于记录上日期的日期。这些文件按降序排序,并拾取第一个文件。这是以前的日期


where子句只是过滤掉距离上一个日期不足100天的任何内容。

为什么结果中包含id=7?另外,如果您有每月第一天的数据,那么您将永远不会包括后续记录,因为差值永远不会超过31,对吗?谢谢您的帮助。是否可以包含代码正在执行的简要细分?假设ID被替换为帐户号。我将如何获得相同的结果,但以和帐户级别为基础。我在MyronAcctNo CurrentMailPromotoDate 256311 2013-01-28 256311 2013-07-01 256311 2013-08-05 2925595 2012-12-10 2925595 2013-03-25 2925595 2013-04-02 2925595 2013-04-08 2925595 2013-04-15 2925595 2013-04-22 2925595 2013-04-29 2925595 2013-05-05 2925595 2013-05-05-27 2925595 2013-05-28下面粘贴了一些虚拟数据2925595 2013-06-03 2925595 2013-06-10 2925595 2013-06-17 2925595 2013-06-24@user2596890 . . . 您可以在子查询的where子句中包含t2.AccountId=t.AccountId行。我这样做了,结果成功了……然而,我遇到的问题是,我试图理解为什么查询工作粘贴在下面,但当我包含注释掉的日期并排除那些工作的日期时,却没有这样做……代码在下面这是temp的代码表创建。注释的值不起作用。选择256311作为id,“2013-01-28”CurrentMailPromotoDate进入测试联合体全部-选择256311,“2013-02-18”联合体全部-选择256311,“2013-02-25”联合体全部选择256311,“2013-03-01”联合体全部-选择256311,“2013-04-02”联合体全部选择256311,“2013-06-09”联合体全部选择256311,“2013-06-10”欧盟所有人选择256311,“2013-07-01”欧盟所有人选择256311,“2013-08-05”欧盟所有人选择256311,“2013-12-27”;