2016-08-09 54 views
5

Ich habe drei Tabellen.Termin Slots funktioniert nicht

Tabelle 1 (Buch)

 CREATE TABLE [dbo].[Booking](
      [Booking_Serno] [int] IDENTITY(1,1) NOT NULL, 
      [Dt] [datetime] NULL, 
      [start] [nvarchar](50) NULL, 
      [todate] [nvarchar](50) NULL, 
      [Service_Id] [int] NULL 
     ) ON [PRIMARY] 

INSERT [dbo].[Booking] ([Booking_Serno], [Dt], [start], [todate], [Service_Id]) VALUES (1, CAST(0x0000A6DA00000000 AS DateTime), N'9:30 AM', N'10:00 AM', 1) 
     GO 

Tabelle 2 (Service)

CREATE TABLE [dbo].[Service](
    [Service_Serno] [int] IDENTITY(1,1) NOT NULL, 
    [Service_Duration] [int] NULL 
) ON [PRIMARY] 
GO 
SET IDENTITY_INSERT [dbo].[Service] ON 
INSERT [dbo].[Service] ([Service_Serno], [Service_Duration]) VALUES (1, 30) 

Tabelle 3 (Regeln)

CREATE TABLE [dbo].[Rules](
    [Rule_Serno] [int] IDENTITY(1,1) NOT NULL, 
    [Start_Dt] [varchar](50) NULL, 
    [End_Dt] [varchar](50) NULL, 
    [from_dt] [varchar](50) NULL, 
    [to_dt] [varchar](50) NULL, 
    [Service_Id] [int] NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
SET IDENTITY_INSERT [dbo].[Rules] ON 
INSERT [dbo].[Rules] ([Rule_Serno], [Start_Dt], [End_Dt], [from_dt], [to_dt], [Service_Id]) VALUES (1, N'2016-07-02', N'2016-07-13', N'07:00', N'17:00', 1) 

Ich führe eine gespeicherte Prozedur aus. Es bringt mir das gewünschte Ergebnis, aber dann versuche ich eine Zeit zu buchen, indem ich das Intervall ändere, die Slots werden leer angezeigt, auch wenn ein Slot belegt ist. Ex. Wenn ich einen Slot für 60 Minuten setze und einen Slot von 7: 00-8: 00 buche, wird gebucht (xxx) angezeigt, aber wenn ich das Intervall auf 30 ändere, wird 7: 00-8: 00 verfügbar. Es sollte tatsächlich 7: 00-7: 30 und 7: 00-8: 00 nicht verfügbar sein. die gespeicherte Prozedur ist

Dt: -12/12/2016; Serviceid: -1

CREATE PROCEDURE [dbo].[RealGetFollowUp] @Dt varchar(50), @ServiceId int 
AS 

    --declare @starttime datetime = '2015-10-28 12:00', @endtime datetime = '2015-10-28 14:00' 
    DECLARE @starttime varchar(50), 
      @endtime varchar(50), 
      @interval int 
    SELECT 
    @starttime = Rules.from_dt, 
    @endtime = Rules.to_dt, 
    @interval = Service.Service_Duration 
    FROM Service 
    INNER JOIN Rules 
    ON Service.Service_Serno = Rules.Service_Id 
    WHERE Service.Service_Serno = @ServiceId 
    --SELECT * INTO #tmp FROM d; 

    DECLARE @slots int 

    SELECT 
    @slots = DATEDIFF(MINUTE, @starttime, @endtime)/@interval 

    SELECT TOP (@slots) 
    N = IDENTITY(int, 1, 1) INTO #Numbers 
    FROM master.dbo.syscolumns a 
    CROSS JOIN master.dbo.syscolumns b; 

    SELECT 
    DATEADD(MINUTE, ((n - 1) * @interval), @starttime) AS start, 
    DATEADD(MINUTE, (n * @interval), @starttime) AS todate INTO #slots 
    FROM #numbers 

    SELECT 
    @Dt AS 'Date', 
    LEFT(CONVERT(varchar, s.start, 108), 10) AS Start, 
    LEFT(CONVERT(varchar, s.todate, 108), 10) AS 'End', 
    CASE 
     WHEN b.start IS NULL THEN '-' 
     ELSE 'xx' 
    END AS Status 
    FROM [#slots] AS s 
    LEFT JOIN Booking AS b 
    ON s.start = b.start 
    AND s.todate = b.todate 
    AND b.Dt = @Dt 


    DROP TABLE #numbers, #slots 
GO 

ich überprüfen müssen, ob es ein Schlitz in der Buchung Tisch gebucht und auch wenn ich das Intervall in der Service-Tabelle zu ändern, die in der Buchungstabelle gebuchte Schlitz soll gezeigt werden, gebucht.

+0

Wie ändern Sie das Intervall in der Service-Tabelle? Und was macht den reservierten Slot wieder verfügbar? – NickyvV

+0

@NickyvV Ich ändere das Intervall von der ** Service_Dauer ** aus der Service-Tabelle. Beim Einfügen der Zeitfenster in die Tabelle ** Buchung werden sie nicht verfügbar "xxx" und wenn Sie es aus ** Buchung ** löschen, werden die Plätze verfügbar. – Fahad

+0

Aber wie bezieht sich das Löschen von Booking auf das Ändern des Intervalls? Ist es dann manuell gemacht? – NickyvV

Antwort

1

Ändern Sie den Ausgang SELECT im sproc zu ...

SELECT 
    @Dt AS 'Date', 
    LEFT(CONVERT(varchar, s.start, 108), 10) AS Start, 
    LEFT(CONVERT(varchar, s.todate, 108), 10) AS 'End', 
    CASE 
     WHEN b.start IS NULL THEN '-' 
     ELSE 'xx' 
    END AS Status 
FROM [#slots] AS s 
LEFT JOIN Booking AS b 
ON ( 
     --Range is bigger than the meeting 
     (s.start <= b.start 
     AND s.todate >= b.todate) 
     OR 
     --Range is smaller than the meeting 
     (s.start Between b.start and b.toDate 
     AND s.todate Between b.start and b.toDate) 
    ) 
    AND b.Dt = @Dt 
+0

@Fahad Ein paar Notizen; 1) Da Sie [start] und [toDate] getrennt von [dt] in [dbo] speichern [Booking], sollten Sie wahrscheinlich [dbo]. [Booking]. [Dt] einen "DATE" -Datentyp haben und die @ dt-Variable im Sproc sollte entweder 'DATETIME' (aktuell) oder' DATE' (wenn Sie es ändern sollten) anstelle von 'VARCHAR' sein, da es eine 'IMPLICIT_CONVERSION' zum Vergleichen von b.dt benötigt zu @dt; 2) Dieses aktuelle Design deckt keine Szenarien ab, in denen eine Buchung an einem Tag beginnt und an einem anderen endet, ich würde [Datum], [ZEIT], [ZEIT] loswerden und stattdessen zwei [DATETIME] -Spalten für StartDate und EndDate verwenden . –