
Originariamente inviato da
guil
Risolto così, ho fatto tutte le prove e va bene:
"SELECT Codfisc, Dal, Al FROM Ferie where Codfisc = @Codfisc and ((Dal) >= @Dal and (Al) <= (@Al)) or ((Dal) <= @Dal and (Al) >= (@Al)) or (Dal between @Dal and @Al)"
Sei sicuro ???????????????
io ho dei dubbi
Innanzitutto non capisco a cosa ti serva il CodiceFiscale nella WHERE perche poi con quel "gioco" di AND e OR prelevi comunque i record indipendentemente dal CodiceFiscale
poi a livello proprio di date hai ancora un problema nel caso hai una richiesta con inizio in un periodo e fine dopo la fine dello stesso periodo
prova il minitest sotto dove c'è anche una ipotesi di soluzione
La tabella è la tua del 1° post mentre i dati sono i tuoi del #8
(mi sono concentrato solamente sulla query SQL)
declare @Dal as date
declare @Al as date
declare @Codfisc as varchar(16)
set @Dal = '2017-09-03' -- '2017-09-03'
set @Al = '2017-09-20' -- '2017-09-20'
set @Codfisc = 'x Prende Tutto x'
-- Per comodita di Test metto i dati di origine
SELECT Codfisc, Dal, Al FROM Ferie ORDER BY Dal;
-- :-( :-( La tua query Perde i record che iniziano in un periodo di ferie e terminano dopo la fine dello stesso periodo
SELECT Codfisc, Dal, Al FROM Ferie where Codfisc = @Codfisc AND ((Dal) >= @Dal and (Al) <= (@Al)) OR ((Dal) <= @Dal and (Al) >= (@Al)) OR (Dal between @Dal and @Al);
-- :-) Cosi sembra che va meglio
SELECT Codfisc, Dal, Al FROM Ferie WHERE ( (@Dal>=Dal AND @Dal<=Al) OR (@Al>=Dal AND @Al<=Al) OR (@Dal<=Dal AND @Al>=Al) );
-- con between è la stessa cosa
SELECT Codfisc, Dal, Al FROM Ferie WHERE ( (@Dal BETWEEN DAL AND Al) OR (@Al BETWEEN Dal AND Al) OR (@Dal<=Dal AND @Al>=Al) );
-- Finito
Facci sapere
.