SQL查找31天时间范围内的日期

SQL查找31天时间范围内的日期,sql,sql-server,date,Sql,Sql Server,Date,我有一个日期列表,需要找到31天时间范围内的第一个日期: ID Date 101 6/8/16 101 10/27/16 101 11/25/16 101 12/14/16 101 1/1/17 101 1/7/17 101 2/1/17 由于第一个日期发生在2016年6月8日,这将是“锚定”日期。2016年6月8日将算作31天期间(2016年6月8日-2016年7月8日)的第一个日期,然后查找发生在2016年7月9日至201

我有一个日期列表,需要找到31天时间范围内的第一个日期:

ID       Date
101     6/8/16
101     10/27/16
101     11/25/16
101     12/14/16
101     1/1/17
101     1/7/17
101     2/1/17
由于第一个日期发生在2016年6月8日,这将是“锚定”日期。2016年6月8日将算作31天期间(2016年6月8日-2016年7月8日)的第一个日期,然后查找发生在2016年7月9日至2016年8月8日之间的第一个日期(如果有),发生在2016年8月9日至2016年9月8日之间,依此类推。此外,所有这些日期必须在每年的1月1日至12月1日之间,因此不包括2016年12月14日。提前谢谢

这方面的输出将是:

ID      Date
101    6/8/16
101    10/27/16
101    11/25/16
101    1/1/17
101    2/1/17

对于每一行,计算与最小日期的差值,并将其除以31以创建这些31天的时段。然后获取每个时段的最小日期。要从12月起排除这些日期,您可以计算MMDD并添加WHERE条件:

WITH cte AS
 (
   SELECT id, date,
      datediff(day, Min(date) Over (partition by id), date) / 31 AS period
   FROM vt
   WHERE datepart(m, date) * 100 + datepart(d, date) 
      BETWEEN 0101 AND 1201
 )
SELECT id, Min(date)
FROM cte
GROUP BY id, period

你能解释一下为什么把它排除在外吗?顺便说一句,请始终尝试对日期使用ansi符号
yyyy-mm-dd
您的预期输出是什么?您可以使用
DATEADD()
以及
DATEPART()
函数来获取日期片段,如日期或月份。例如,如果希望第一个日期+31天,可以执行
选择DATEADD(DAY,31,CAST('6/8/16'作为datetime))
DATEPART()函数将返回日期的某些部分,如DAY、dayofweek、month或year。为什么要排除12月内的日期?表中是否有保证顺序的序列号?这是毫无意义的