Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Anzahl der Wochen und Teilwochen zwischen zwei Tagen falsch berechnet

DATEDIFF zählt Übergänge , nicht Punkte (siehe z. B. DATEDIFF(year,'20161231','20170101') ). Es behandelt auch den Sonntag als den ersten Tag der Woche. Wie kompensieren wir also diese Merkmale? Erstens verschieben wir unsere Daten so, dass Montag die neuen Sonntage sind, und zweitens fügen wir 1 hinzu, um den Fence-Post-Fehler zu kompensieren:

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

Ergebnisse:

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

Wenn dies nicht Ihren Vorstellungen entspricht, können Sie vielleicht meine @Samples übernehmen und anpassen Tabelle, um die erwarteten Ergebnisse anzuzeigen.