Vous aurez besoin d'un nombre ou table de calendrier pour rendre les choses faciles, ou nous pouvons simuler une si la plage est faible. Est-ce que la TaskDate est une date claire ou a-t-elle aussi une composante de temps?
Plan de base d'attaque est:
declare @StartDate datetime
declare @EndDate datetime
/* Set @StartDate and @EndDate to represent the range */
with Digits as (
select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all select 9
), Numbers as (
select (D1.d * 100) + (D2.d * 10) + D3.d as n
from Digits D1,Digits D2,Digits D3
), TaskDates as (
select
t.TaskID,
DATEADD(day,n.n,@StartDate) as TaskDate
from
Tasks t
inner join
Numbers n
on
DATEADD(day,n.n,@StartDate) <= @EndDate
)
select
*
from
TaskDates td1
left join
TasksDone td2
on
td1.TaskID = td2.TaskID and
DATEDIFF(day,td1.TaskDate,td2.TaskDate) = 0
where
td2.TaskID is null
Les deux premiers CTEs construire un petit nombre table, le 3ème CTE construit un ensemble de TaskIDs et des dates dans la plage requise. La sélection finale fait correspondre les thèses avec la table TasksDone, puis supprime les lignes où une correspondance est trouvée. Si TasksDone.TaskDate est une date normale (pas de composant time) et que @StartDate est également sans composant time, vous pouvez abandonner DATEDIFF et utiliser simplement td1.TaskDate = td2.TaskDate.
Si vous avez besoin d'une large gamme (ci-dessus peuvent couvrir ~ 3 ans), je vous suggère de construire une table de nombre approprié ou une table de calendrier
Il n'y a pas construit dans la fonctionnalité dans SQL Server pour obtenir toutes les dates dans une gamme, ou similaire. Vous devez le construire en utilisant une table de nombres ou une table de calendrier. –