sql >> Base de Datos >  >> RDS >> Sqlserver

Número de semanas y semanas parciales entre dos días mal calculado

DATEDIFF cuenta transiciones , no períodos (por ejemplo, mire DATEDIFF(year,'20161231','20170101') ). También trata el domingo como el primer día de la semana. Entonces, ¿cómo compensamos estas características? Primero, cambiamos nuestras fechas para que los lunes sean los nuevos domingos, y segundo, agregamos 1 para compensar el error de Fence-Post:

declare @Samples table (
    StartAt date not null,
    EndAt date not null,
    SampleName varchar(93) not null
)
insert into @Samples (StartAt,EndAt,SampleName) values
('20170101','20170131','Question - 6'),
('20170102','20170129','Exactly 4'),
('20170102','20170125','3 and a bit, round to 4'),
('20170101','20170129','4 and 1 day, round to 5')
--DATEDIFF counts *transitions*, and always considers Sunday the first day of the week
--We subtract a day from each date so that we're effectively treating Monday as the first day of the week
--We also add one because DATEDIFF counts transitions but we want periods (FencePost/FencePanel)
select *,
    DATEDIFF(WEEK, DATEADD(day,-1,StartAt), DATEADD(day,-1,EndAt)) +1
    as NumWeeks
from @Samples

Resultados:

StartAt    EndAt      SampleName                 NumWeeks
---------- ---------- -------------------------- -----------
2017-01-01 2017-01-31 Question - 6               6
2017-01-02 2017-01-29 Exactly 4                  4
2017-01-02 2017-01-25 3 and a bit, round to 4    4
2017-01-01 2017-01-29 4 and 1 day, round to 5    5

Si esto no coincide con lo que desea, tal vez pueda adoptar y adaptar mi @Samples tabla para mostrar los resultados que espera.