DATEDIFF
số lượng chuyển tiếp , không phải khoảng thời gian (ví dụ:xem DATEDIFF(year,'20161231','20170101')
). Nó cũng coi Chủ nhật là ngày đầu tiên trong tuần. Vì vậy, làm thế nào để chúng tôi bù đắp cho các tính năng này? Đầu tiên, chúng tôi thay đổi ngày của mình để Thứ Hai là Chủ Nhật mới và thứ hai, chúng tôi thêm 1 để bù cho lỗi Hàng rào-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
Kết quả:
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
Nếu điều này không phù hợp với những gì bạn muốn, có lẽ bạn có thể áp dụng và điều chỉnh @Samples
của tôi để hiển thị kết quả bạn mong đợi.