Sé que este puede parecer un poco confuso, ¡solo estoy tratando de contemplar la mejor manera de transmitirlo! Ya publiqué esto en un par de foros, pero parece que no estoy teniendo suerte. Con suerte, alguien puede ofrecer algunas sugerencias sobre cómo hacer esto.Lista de horarios disponibles a partir de 2 DateTimes
Ejemplo mesa (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
Básicamente, quiero entrar 2 veces la fecha, tales como 16/07/2012 8:30 y 16/07/2012 13:30, y consultará mi tabla de ejemplo de arriba y devolverá las horas 'disponibles', IE, me gustaría que muestre lo siguiente.
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
Mi pregunta es, ¿esto es completamente posible en SQL? Intenté pensar en cómo hacerlo en VB y también estoy luchando con eso. Mi idea/intento ha estado utilizando fn_daterange de Ron Savage (como se muestra abajo)
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
luego iba a llamarlo por mediante el siguiente, pero mi problema es, me.DateEnded está fuera de dr.enddate y por lo tanto la ocurrencia sería '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
alguien puede sugerir una mejor manera de hacer esto o con suerte ofrecer una solución a la manera en que yo estoy tratando de hacer en la actualidad?
¡Gracias de antemano!
¿A qué hora es '16/07/2012 09: 90'? –
Tim Schmelte, Easter Egg =) –
¿Qué dbms está usando, SQL-Server (qué versión)? Básicamente, tiene un datetime de inicio y un datetime de finalización (por lo tanto, un TimeSpan. Ahora quiere encontrar las medias horas que son gratuitas (no reservadas). ¿Es correcto? –