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