DATEDIFF
menghitung transisi , bukan titik (mis. lihat DATEDIFF(year,'20161231','20170101')
). Itu juga memperlakukan hari Minggu sebagai hari pertama dalam seminggu. Jadi, bagaimana kita mengkompensasi fitur-fitur ini? Pertama, kami menggeser tanggal kami sehingga Senin adalah hari Minggu baru, dan kedua kami menambahkan 1 untuk mengkompensasi kesalahan Pagar-Pos:
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
Hasil:
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
Jika ini tidak sesuai dengan yang Anda inginkan, mungkin Anda dapat mengadopsi dan mengadaptasi @Samples
saya tabel untuk menunjukkan hasil yang Anda harapkan.