Έχεις δίκιο... εν μέρει. Η απάντησή μου ήταν λίγο επιπόλαια. Για παράδειγμα, όπως διατύπωσα τη συνθήκη αρχικά, στο σενάριο:
ContractStartDate < ContractEndDate < @fromDate <= @toDate, η εγγραφή θα εμφανιστεί ενώ κανονικά πρέπει ν' απορριφθεί.
Μερικές φορές αποφεύγει κανείς τα προβλήματα με την άμεση προσέγγιση, όσο κι αν αυτή δεν είναι η πλέον "εκλεπτυσμένη". Συνεπώς, το πιο αξιόπιστο είναι το:
@fromDate <= ContractStartDate <= @toDate
OR
@fromDate <= ContractEndDate <= @toDate
OR
ContractStartDate < (@fromDate <= @toDate) < ContractEndDate => ContractStartDate < @toDate < ContractEndDate
Δηλαδή, το query πρέπει να γίνει:
(ContractStartDate between @fromDate and @toDate)
OR
(ContractEndDate between @fromDate and @toDate)
OR
(@toDate between ContractStartDate and ContractEndDate) (εντάξει, παίζει και η ισότητα...)
Αν κάποιο μέλος διαπιστώσει ότι υπάρχει και κάποια περίπτωση(-εις) που μου διαφεύγει(-ουν), παρακαλώ ας κάνει post.
Τέλος, όσον αφορά στο δεύτερο ερώτημα, δεν έχω καταλάβει από ποια ημερομηνία αφαιρείται η ContractStartDate. Αν η διαφορά εξαρτάται και από τα input dates (@fromDate, @toDate), τότε θα πρέπει να φτιάξεις function που σου επιστρέφει την ημερομηνία από την οποία θα αφαιρέσεις την ContractStartDate και την οποία θα πρέπει να συμπεριλάβεις στη συνάρτηση DateDiff στο αρχικό select statement.
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!