una rango por obtener mes mayor generar filtrar fechas fecha entre consulta comparar año sql tsql select while-loop cursor

rango - obtener mes y año de una fecha sql



SQL Seleccione cumpleaños en un rango de fechas específico (2)

En primer lugar, creamos todas las fechas para un rango determinado. luego aplica la lógica

DECLARE @StartDate datetime = ''05/01/2015''; DECLARE @EndDate datetime = ''06/01/2017''; ;With DateSequence as ( Select @StartDate as Bdate union all Select dateadd(day, 1, Bdate) from DateSequence where Bdate < @EndDate ) Select ID,FirstName,Bdate as BirthDate from DateSequence cross join @TempTable where Bdate between @StartDate and @EndDate and month(Bdate)= month(BirthDate) and day(Bdate) = day(BirthDate) order by ID asc , Bdate desc option (MaxRecursion 2000)

OutPut:

Tengo lo siguiente:

DECLARE @TempTable TABLE ( [Id] [int], [FirstName] [varchar](40) NULL, [Birthdate] [date] NULL ); insert into @TempTable values (1, ''A'', convert(date, ''05/25/2017'', 101)) insert into @TempTable values (2, ''B'', convert(date, ''06/25/2017'', 101))

Lo que necesito es una consulta que devolverá todos los cumpleaños en el rango de StartDate a EndDate.

Para estar más aquí es lo que espero obtener como resultado:

Caso 1: si el rango de fechas está establecido en:

DECLARE @StartDate datetime = ''05/01/2017''; DECLARE @EndDate datetime = ''07/01/2017'';

La consulta debería regresar:

1 A 2017-05-25 2 B 2017-06-25

Caso 2: si el rango de fechas se establece en:

DECLARE @StartDate datetime = ''05/01/2017''; DECLARE @EndDate datetime = ''06/01/2017'';

La consulta debería regresar:

1 A 2017-05-25

Caso 3: si el rango de fechas se establece en:

DECLARE @StartDate datetime = ''05/01/2015''; DECLARE @EndDate datetime = ''07/01/2017'';

La consulta debería regresar:

1 A 2017-05-25 1 A 2016-05-25 1 A 2015-05-25 2 B 2017-06-25 2 B 2016-06-25 2 B 2015-06-25

Caso 4: si el rango de fechas se establece en:

DECLARE @StartDate datetime = ''05/01/2015''; DECLARE @EndDate datetime = ''06/01/2017'';

La consulta debería regresar

1 A 2017-05-25 1 A 2016-05-25 1 A 2015-05-25 2 B 2016-06-25 2 B 2015-06-25


En su nivel más básico, puede hacer esto creando una lista del cumpleaños de todos por 100 años, luego filtrando ...

with numbers as ( select 0 as NN union all select NN+1 from numbers where NN < 100 ) select id, dateadd(yy,NN,BirthDate) as Birthdays from numbers cross join @TempTable where dateadd(yy,NN,BirthDate) between @StartDate and @EndDate