sql >> Database >  >> RDS >> Sqlserver

Aantal weken en gedeeltelijke weken tussen twee dagen verkeerd berekend

DATEDIFF telt overgangen , geen perioden (kijk bijvoorbeeld naar DATEDIFF(year,'20161231','20170101') ). Het behandelt ook de zondag als de eerste dag van de week. Dus, hoe compenseren we deze functies? Ten eerste verschuiven we onze datums zodat maandag de nieuwe zondag is, en ten tweede voegen we 1 toe om de Fence-Post-fout te compenseren:

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

Resultaten:

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

Als dit niet overeenkomt met wat je wilt, kun je misschien mijn @Samples adopt overnemen en aanpassen tabel om de resultaten weer te geven die u wel verwacht.



  1. SQL-query blijft zeer lang actief als zoekterm niet wordt gevonden

  2. Hoe verwijder je alle dubbele records in PHP/Mysql

  3. SSIS en MySQL - Probleem met scheidingstekens voor tabelnaam

  4. Soorten Index in orakel?