sql >> Databáze >  >> RDS >> Sqlserver

Počet týdnů a dílčích týdnů mezi dvěma dny vypočítaný špatně

DATEDIFF počítá přechody , nikoli období (např. podívejte se na DATEDIFF(year,'20161231','20170101') ). Také považuje neděli za první den v týdnu. Jak tedy tyto vlastnosti kompenzujeme? Za prvé, posouváme naše data tak, aby pondělí byly nové neděle, a za druhé přidáme 1, abychom kompenzovali chybu 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

Výsledky:

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

Pokud toto neodpovídá tomu, co chcete, možná můžete převzít a upravit mé @Samples tabulka zobrazí výsledky, které očekáváte.



  1. Jak mohu provést spouštěč PŘED AKTUALIZACÍ se serverem SQL?

  2. Základy tabulkových výrazů, část 12 – Inline tabulkové funkce

  3. Jak používat relaci na webových stránkách?

  4. Ladění spouštěčů MySQL