SQL查找31天时间范围内的日期
我有一个日期列表,需要找到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
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月内的日期?表中是否有保证顺序的序列号?这是毫无意义的