So che questo può sembrare un po 'confuso, sto solo cercando di contemplare il modo migliore di farlo passare! Ho postato questo su un paio di forum ora, ma non mi sembra che abbia avuto fortuna. Spero che qualcuno possa offrire alcuni suggerimenti su come farlo.Lista orari disponibili da 2 DateTimes
tabella di esempio (tbl_Bookings)
ID DateStarted DateEnded RoomID
1 16/07/2012 09:00 16/07/2012 10:00 1
2 16/07/2012 12:00 16/07/2012 13:00 1
Fondamentalmente, voglio entrare 2 volte data, come ad esempio 16/07/2012 08:30 alle 13:30 16/07/2012, e interrogherà la mia tabella di esempio sopra e restituirà 'disponibili' volte, IE, mi piacerebbe che producesse quanto segue.
16/07/2012 08:30 - 16/07/2012 09:00
16/07/2012 10:00 - 16/07/2012 12:00
16/07/2012 13:00 - 16/07/2012 13:30
La mia domanda è, è tutto possibile in SQL? Ho provato a pensare a come farlo in VB e anche io sto lottando con quello. La mia idea/tentativo è stato utilizzato fn_daterange di Ron Savage (come illustrato di seguito)
if exists (select * from dbo.sysobjects where name = 'fn_daterange') drop function fn_daterange;
go
create function fn_daterange
(
@MinDate as datetime,
@MaxDate as datetime,
@intval as datetime
)
returns table
as
return
WITH times (startdate, enddate, intervl) AS
(
SELECT @MinDate as startdate, @MinDate + @intval - .0000001 as enddate, @intval as intervl
UNION ALL
SELECT startdate + intervl as startdate, enddate + intervl as enddate, intervl as intervl
FROM times
WHERE startdate + intervl <= @MaxDate
)
select startdate, enddate from times;
go
stavo andando poi a chiamare utilizzando il sotto, ma il mio problema è, me.DateEnded è al di fuori di dr.enddate e quindi la occurance sarebbe '0':
SELECT dr.startdate, dr.enddate, count(me.DateStarted) as occurrence
FROM fn_daterange('16/07/2012 08:30', '16/07/2012 13:30', '00:30:00') dr
LEFT OUTER JOIN tbl_Bookings me
ON me.DateStarted BETWEEN dr.startdate AND dr.enddate
AND me.DateEnded BETWEEN dr.startdate AND dr.enddate)
GROUP BY dr.startdate, dr.enddate
qualcuno può forse suggerire un modo migliore di fare questo o si spera di offrire una soluzione per il modo in cui sto cercando di farlo al momento?
Grazie in anticipo!
Che ora è '16/07/2012 09: 90'? –
Tim Schmelte, Easter Egg =) –
Quali dbms state usando, SQL-Server (quale versione)? Fondamentalmente hai un datetime di inizio e un datetime di fine (quindi un TimeSpan.) Ora vuoi trovare le mezze ore libere (non prenotate) .Sempre corretto? –