Ich weiß, dass dieser ein wenig verwirrend sein kann, ich versuche nur, den besten Weg zu erwägen, es umzusetzen! Ich habe das jetzt in ein paar Foren gepostet, aber ich habe kein Glück. Hoffentlich kann jemand einige Vorschläge machen, wie man das macht.Liste verfügbarer Zeiten von 2 DateTimes
Beispieltabelle (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
Grundsätzlich möchte ich 2 mal Datum einzugeben, wie 16/07/2012 16/07/2012 08:30 bis 13:30, und es wird meine Beispieltabelle oben abfragen und "verfügbare" Zeiten zurückgeben, IE, ich möchte, dass es folgendes ausgibt.
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
Meine Frage ist, dann ist dies durchaus möglich, in SQL? Ich habe versucht, darüber nachzudenken, wie man es in VB macht, und ich kämpfe auch mit diesem. Meine Idee/Versuch wurde mit Ron Savage fn_daterange (siehe unten)
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
Ich wurde dann geht es zu nennen, indem die unten verwenden, aber mein Problem ist, me.DateEnded außerhalb von dr.enddate ist und damit die Auftreten würde ‚0‘ sein:
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
Kann jemand möglicherweise vorschlagen, einen besseren Weg, dies zu tun, oder hoffentlich eine Lösung für die Art und Weise anbietet ich versuche es noch zu tun?
Vielen Dank im Voraus!
Welche Zeit ist '16.07.2012 09: 90'? –
Tim Schmelte, Easter Egg =) –
Welche DBMS verwendest du, SQL-Server (welche Version)? Im Grunde haben Sie einen Start DateTime und einen EndDateTime (daher ein TimeSpan. Jetzt wollen Sie die Halbstunden finden die frei sind (nicht gebucht). Ist das korrekt? –