Je ne suis pas sûr que je comprends votre question. Pour une date donnée, vous voulez voir le nombre de lignes (événements) retournées?
Donc, pour le 01/02/09, vous devriez voir 1, pour le 02/02/09, vous devriez voir 0 ??? SQL:
declare @temp table (evt varchar(10), start datetime, [end] datetime)
insert into @temp values('e1', '1/1/2009', '2/1/2009')
insert into @temp values('e2', '1/15/2009', '1/31/2009')
insert into @temp values('e3', '8/15/2008', '1/16/2009')
insert into @temp values('e4', '2/3/2009', '2/15/2009');
select * from @temp where start < '2/1/2009' and [end] >= '2/1/2009'
select * from @temp where start < '2/2/2009' and [end] >= '2/2/2009'
C#/LINQ:
public class Event
{
public string eventID;
public DateTime start;
public DateTime end;
}
static void Main(string[] args)
{
IList<Event> events = new List<Event>();
events.Add(new Event { eventID = "e1", start = new DateTime(2009, 1, 1), end = new DateTime(2009, 2, 1) });
events.Add(new Event { eventID = "e2", start = new DateTime(2009, 1, 15), end = new DateTime(2009, 1, 31) });
events.Add(new Event { eventID = "e3", start = new DateTime(2008, 8, 15), end = new DateTime(2009, 1, 16) });
events.Add(new Event { eventID = "e4", start = new DateTime(2009, 2, 3), end = new DateTime(2009, 2, 15) });
DateTime eventDate = new DateTime(2009, 2, 1);
var available = events.Where(e => e.start.CompareTo(eventDate) < 1 && e.end.CompareTo(eventDate) > -1);
Console.WriteLine(available.Count());
eventDate = new DateTime(2009, 2, 2);
available = events.Where(e => e.start.CompareTo(eventDate) < 1 && e.end.CompareTo(eventDate) > -1);
Console.WriteLine(available.Count());
eventDate = new DateTime(2009, 1, 16);
available = events.Where(e => e.start.CompareTo(eventDate) < 1 && e.end.CompareTo(eventDate) > -1);
Console.WriteLine(available.Count());
Console.ReadLine();
}
EDIT: Ce n'est pas assez, mais ce SQL vous donnera le résultat que vous avez demandé:
declare @temp table (evt varchar(10), start datetime, [end] datetime)
declare @result table (available datetime)
insert into @temp values('e1', '1/1/2009', '2/1/2009')
insert into @temp values('e2', '1/15/2009', '1/31/2009')
insert into @temp values('e3', '8/15/2008', '1/16/2009')
insert into @temp values('e4', '2/3/2009', '2/15/2009');
declare @start datetime
declare @end datetime
set @start = '1/1/2009'
set @end = '2/16/2009'
while @start < dateadd(day, 1, @end)
begin
declare @rowCount int
select @rowCount = count(*) from @temp where start <= @start and [end] >= @start
if @rowCount = 0
insert into @result values(@start)
set @start = dateadd(day, 1, @start)
end
select * from @result
Je pense que cela fonctionnerait. –
+1 pour le déclar @temp - Je n'aurais jamais pensé à cela pour une réponse SO ... –