Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błędnie obliczona liczba tygodni i częściowych tygodni między dwoma dniami

DATEDIFF zlicza przejścia , a nie kropki (np. spójrz na DATEDIFF(year,'20161231','20170101') ). Traktuje również niedzielę jako pierwszy dzień tygodnia. Jak więc kompensujemy te cechy? Po pierwsze, przesuwamy nasze daty, aby poniedziałki były nowymi niedzielami, a po drugie dodajemy 1, aby zrekompensować błąd słupka ogrodzeniowego:

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

Wyniki:

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

Jeśli to nie pasuje do tego, czego chcesz, być może możesz adoptować i dostosować moje @Samples tabela, aby pokazać oczekiwane wyniki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak upuścić kolumnę z ograniczeniem?

  2. Włącz serwer SQL „xp_cmdshell”

  3. Jak serializować duży wykres obiektu .NET do obiektu BLOB programu SQL Server bez tworzenia dużego bufora?

  4. Próbuję utworzyć procedurę składowaną, aby utworzyć login i użytkownika bazy danych?

  5. Jak używać TO_Char() w SQL Server 2008