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

时间:2017-07-14 20:01:30

标签: 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日,那将是'锚点'日期。 6/8/16将被视为31天期间的第一个日期(2016年6月8日 - 2016年7月8日),然后找到第一个日期发生在7/9/16和8/8 /之间16如果他们有一个,在8/9/16 - 9/8/16之间,依此类推。此外,所有这些日期必须在每年的1月1日至12月1日之间,因此不包括12/14/16。提前谢谢。

这个的输出是:

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

1 个答案:

答案 0 :(得分:1)

对于每一行,计算与最小日期的差异,并将其除以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