SP - Abfrage für Kollisionen in einem Eventkalender

AlexD1979

Erfahrenes Mitglied
Hallo,
Ich habe eine Datenbank, die Termine eines Buchungssystems enthält. Nun habe ich eine SP, die Kollisionen erkennen soll und dementsprechend die IDs der kollidierenden events ausgibt.

Die SP befindet sich im Anhang.

Die Daten sind wie folgt:
Das ist das (Teil-)Ergebnis der Abfrage in Reihe 39 till 44:
Code:
event_id      event_event_type      event_series_type      event_weekday      event_date_from      event_time_from      event_date_to      event_time_to
50648      0      0      NULL      2011-10-19 00:00:00.000      465      2011-10-19 00:00:00.000      1005
50823      0      0      NULL      2011-10-24 00:00:00.000      1080      2011-10-24 00:00:00.000      1200
50877      0      0      NULL      2011-11-03 00:00:00.000      1125      2011-11-03 00:00:00.000      1260
50965      1      1      15      2011-11-02 00:00:00.000      465      2011-12-06 00:00:00.000      990
50995      0      0      NULL      2011-10-25 00:00:00.000      390      2011-10-25 00:00:00.000      1230
50996      0      0      NULL      2011-10-26 00:00:00.000      390      2011-10-26 00:00:00.000      540
51036      0      0      NULL      2011-10-28 00:00:00.000      525      2011-10-28 00:00:00.000      735
Der Aufruf der Funktion ist:
SELECT event_id FROM dbo.checkA('18.10.2011 09:46', '08.11.2011 10:44', 2, 586, 644, null, null, null)

Liefert:
event_id
50316
50965
51874

Aber es sollte ebenso das Event mit der ID 50995 in der Liste sein, denn das ist ein Termin Dienstag 25.10.2011 die die Ressource blockiert und daher eine Kollision gibt.

Hier die SP:
SQL:
USE [lkshg4_test]
GO
/****** Object:  UserDefinedFunction [dbo].[checkA]    Script Date: 08/29/2011 21:47:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[checkA] (@datefrom datetime, @dateto datetime, @weekday int,@timefrom int, @timeto int, @monthly int, @quartal int, @yearly int) 
               returns @result table (event_id int NOT NULL, chk_from datetime NULL, chk_to datetime NULL, serial int NULL) as
	begin
	declare @event_id INT
	declare @event_series_type int
	declare @event_weekday int
	declare @event_weekday_ret int
	declare @event_date_from datetime
	declare @event_time_from int
    declare @event_date_to datetime
	declare @event_time_to int
    declare @event_event_type int
	declare @i int
	declare @e int
	declare @datum1 datetime
	declare @datum2 datetime
    declare @uhrzeit1 int
    declare @uhrzeit2 int
    if (@weekday is null) set @weekday=-1    
    if (@monthly is null) set @monthly = -1
	if (@quartal is null) set @quartal =-1
	if (@yearly is null) set @yearly = -1
    set @uhrzeit1 = @timefrom
    set @uhrzeit2 = @timeto
    if (@uhrzeit1 is null)
    begin
        set @uhrzeit1 = cast((datepart(hh, @datefrom)*60)+datepart(mi, @datefrom) as int)
    end
    if (@uhrzeit2 is null)
    begin
        set @uhrzeit2 = cast((datepart(hh, @dateto)*60)+datepart(mi, @dateto) as int)
    end
	declare event_records cursor local for 
		SELECT  event_id, event_event_type, event_series_type, event_weekday, event_date_from, event_time_from, event_date_to, event_time_to
		   FROM rrv_event
		  WHERE	( dbo.isEqualNot(@datefrom, @dateto, dbo.getDateFull(event_date_from_internal,event_time_from_internal), dbo.getDateFull(event_date_to_internal,event_time_to_internal))=1 and event_event_type=0)
             OR (   event_event_type=1 
                    AND dbo.isEqualNot(dbo.truncDate(@datefrom), dbo.truncDate(@dateto), event_date_from, event_date_to)=1
                 )
	open event_records
	fetch next from event_records into @event_id, @event_event_type, @event_series_type, @event_weekday, @event_date_from, @event_time_from, @event_date_to, @event_time_to 
	while (@@fetch_status <> -1)
	begin
		-- Normale Abfrage
		if (@event_event_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1) 
		begin
                insert into @result (event_id, chk_from, chk_to, serial ) values (@event_id, dbo.getDateFull(@datefrom, @uhrzeit1), dbo.getDateFull(@dateto, @uhrzeit2), 0)
		end
		-- Täglich
		if (@event_event_type=1 and @event_series_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1) 
		begin
			if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
            begin
                insert into @result (event_id, chk_from, chk_to, serial) values (@event_id, dbo.getDateFull(@datefrom, @uhrzeit1), dbo.getDateFull(@dateto, @uhrzeit2), 1)
            end
		end
		-- Wöchentlich
		if (@event_event_type=1 and @event_series_type=1 and @weekday<>-1) 
		begin
			if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
            begin
                set @event_weekday_ret = 0
                set @e = 1
                while (@e<129)
                begin
                    if(@event_weekday_ret=0)set @event_weekday_ret = dbo.isEqualInt((@weekday & @e),(@event_weekday & @e))
                    set @e = @e + @e
                end
                if(@event_weekday_ret=1) insert into @result (event_id) values (@event_id)
            end
		end
		-- Monatlich
		if (@event_event_type=1 and @event_series_type=2 and @monthly <>-1) 
		begin
			if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
            begin
                if (day(@datefrom)=day(@event_date_from)) 
                begin
                    if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
                    begin
                        insert into @result (event_id) values (@event_id)
                    end
                end
            end
		end
		-- Quartal
		if (@event_event_type=1 and @event_series_type=3 and @quartal <>-1) 
		begin
			if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
            begin
                if ( day(@datefrom)=day(@event_date_from) AND (datediff(mm, @datefrom, @event_date_from) % 3)=0 )
                begin
                    if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
                    begin
                        insert into @result (event_id) values (@event_id)
                    end
                end
            end
		end
    	fetch next from event_records into @event_id, @event_event_type, @event_series_type, @event_weekday, @event_date_from, @event_time_from, @event_date_to, @event_time_to 
		-- Jaehrlich
		if (@event_event_type=1 and @event_series_type=4 and @yearly <>-1) 
		begin
			if (dbo.isEqualNotInt(@uhrzeit1, @uhrzeit2, @event_time_from, @event_time_to)=1)
            begin
                if ( day(@datefrom)=day(@event_date_from) AND  month(@datefrom)=month(@event_date_from))
                begin
                    if(@timefrom>=@event_time_from AND @timefrom<=@event_time_to) OR (@timeto>=@event_time_from AND @timeto<=@event_time_to)
                    begin
                        insert into @result (event_id) values (@event_id)
                    end
                end
            end
		end
	end
	close event_records
	deallocate event_records
	return
	end
 

Anhänge

  • SP_CheckA.txt
    10,9 KB · Aufrufe: 11
Zuletzt bearbeitet von einem Moderator:
Als erstes sollten wir mal definieren mit was für einer Datenbank du arbeiten willst. MySQL, Oracle, MS SQL?
 
Hallo,
Sorry, es ist ein MS SQL 2008 R2 Server.

Was ich schon eingrenzen konnte, aber nicht weiß wie ich es lösen soll ist, dass die gewünschte Kollisiton mit ID 50995 angezeigt wird, wenn ich in der Zeile:

while (@@fetch_status <> -1)
begin
-- Normale Abfrage
if (@event_event_type=0 and @weekday=-1 and @monthly=-1 and @quartal=-1 and @yearly=-1)

das @weekday=-1 entferne, dann kommt die Kollision mit. Der Wert ist aber 2 durch den SP Aufruf. Leider kommen dann aber auch unerwünschte Ergebnisse mit, die nicht zu meiner Anfrage mit dem Wochentag-Bit = 2 passen.
 
Hab zwar kein Schimmer von MS SQL, aber:

Bitte schreibe deinen Code in die sog. Code-Tags - z.B. [code=sql][/code] - die deinen Code formatieren. Danke!
 
Zurück