например, если я выберу октябрь, все контракты, которые существуют в октябре: независимо от того, истекает ли они в декабре или заканчивается 15 октября.
переводится как
SELECT * FROM CONTRACTS
WHERE
([DateDebut] >= '20191001' AND [DateDebut] <= EOMONTH('20191001')) -- starting in Oct
OR ([DateFin] >= '20191001' AND [DateFin] <= EOMONTH('20191001')) -- ending in Oct
OR ([DateDebut] < '20191001' AND ([DateFin] > EOMONTH('20191001') OR [DateFin] IS null)) -- started before Oct, but not ended
Пример
create table contracts ( [Id] varchar(3), [DateDebut] Date , [DateFin] Date, [Name] varchar(50) );
insert into contracts (id, [DateDebut], [DateFin], [Name]) values
('1', '20120618', '20190920','[-] Before Oct'),
('2', '20190915', '20191015','[+] Ends middle of Oct'),
('3', '20191020', '20191021','[+] Fully in Oct'),
('4', '20191028', '20191224','[+] Ends after Oct'),
('5', '20191128', '20191224','[-] After Oct'),
('6', '20190901', '20191001','[+] Ends 1st of Oct'),
('7', '20191001', '20191201','[+] Starts 1st of Oct'),
('8', '20191001', '20191031','[+] Full month'),
('9', '20191031', '20191201','[+] Starts 31st of Oct'),
('10', '20190901', '20191201','[+] Starts before Oct and ends after Oct');
SELECT * FROM CONTRACTS
WHERE
--NOT(
([DateDebut] >= '20191001' AND [DateDebut] <= EOMONTH('20191001')) -- starting in Oct
OR ([DateFin] >= '20191001' AND [DateFin] <= EOMONTH('20191001')) -- ending in Oct
OR ([DateDebut] < '20191001' AND ([DateFin] > EOMONTH('20191001') OR [DateFin] IS null)) -- started before Oct, but not ended
--)
возвращает
Id DateDebut DateFin Name
2 2019-09-15 2019-10-15 [+] Ends middle of Oct
3 2019-10-20 2019-10-21 [+] Fully in Oct
4 2019-10-28 2019-12-24 [+] Ends after Oct
6 2019-09-01 2019-10-01 [+] Ends 1st of Oct
7 2019-10-01 2019-12-01 [+] Starts 1st of Oct
8 2019-10-01 2019-10-31 [+] Full month
9 2019-10-31 2019-12-01 [+] Starts 31st of Oct
10 2019-09-01 2019-12-01 [+] Strats before Oct and ends after Oct
Просто чтобы быть уверенным, что НЕ (...) возвращает
Id DateDebut DateFin Name
1 2012-06-18 2019-09-20 [-] Before Oct
5 2019-11-28 2019-12-24 [-] After Oct
Fiddle
Примечание: я использую '20191001', а не '2019-10-01', чтобы избежать сценария, в котором это означает 10 января вместо 1 октября.