Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Броят на седмиците и частичните седмици между два дни е изчислен неправилно

DATEDIFF отчита преходи , а не периоди (напр. вижте DATEDIFF(year,'20161231','20170101') ). Той също така третира неделята като първи ден от седмицата. И така, как да компенсираме тези характеристики? Първо, изместваме нашите дати, така че понеделниците да са новите недели, и второ, добавяме 1, за да компенсираме грешката на стълба на оградата:

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

Резултати:

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

Ако това не отговаря на това, което искате, може би можете да приемете и адаптирате моите @Samples таблица, за да покажете резултатите, които очаквате.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Няма поддръжка за OVER в MS SQL Server 2005?

  2. Вътрешни елементи на SQL Server:Планово кеширане, т. I – Планове за повторно използване

  3. Как да създадете функция за начало и край на лятното часово време в SQL Server

  4. Xampp MS SQL сървър PHP 5.6

  5. Настройката на SMO ConnectionContext.StatementTimeout се игнорира