2016-08-09 8 views
5

पर काम नहीं कर रहा है मेरे पास तीन टेबल हैं।अपॉइंटमेंट स्लॉट

तालिका 1. (बुकिंग)

 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 

तालिका 2. (सेवा)

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) 

तालिका 3 (नियम)

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) 

मैं संग्रहीत प्रक्रिया चला रहा हूं। यह मुझे वांछित परिणाम प्राप्त करता है लेकिन फिर मैं अंतराल को बदलकर एक समय बुक करने की कोशिश कर रहा हूं, स्लॉट बुक किए जाने पर भी स्लॉट खाली दिखाई देता है। पूर्व। अगर मैं 60 मिनट के लिए स्लॉट सेट कर रहा हूं और 7: 00-8: 00 से स्लॉट बुक करता हूं तो यह बुक (xxx) दिखाता है लेकिन जब मैं अंतराल को 30 से 7: 00-8: 00 में बदल जाता हूं। इसे वास्तव में 7: 00-7: 30 और 7: 00-8: 00 अनुपलब्ध होना चाहिए। संग्रहित प्रक्रिया

डीटी: -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 

मैं अगर वहाँ एक स्लॉट बुकिंग तालिका में बुक किया गया और यहां तक ​​कि अगर मैं सेवा तालिका में अंतराल बदलने के लिए, बुकिंग तालिका में आरक्षित स्लॉट के रूप में दिखाया जाना चाहिए है जांच करने की आवश्यकता बुक।

+0

कैसे आप सेवा तालिका में अंतराल बदल रहे हैं? और स्लॉट फिर से उपलब्ध होने के लिए क्या बुक करता है? – NickyvV

+0

@NickyvV मैं सेवा तालिका से ** सेवा अवधि ** से अंतराल बदल रहा हूं। ** बुकिंग ** तालिका में समय स्लॉट डालने पर वे अनुपलब्ध 'xxx' बन जाते हैं और यदि आप इसे ** बुकिंग ** से हटाते हैं तो स्लॉट उपलब्ध हो जाते हैं। – Fahad

+0

लेकिन अंतराल को बदलने से संबंधित बुकिंग से कैसे हट रहा है? क्या यह मैन्युअल रूप से किया जाता है? – NickyvV

उत्तर

1

बदलें करने के लिए sproc में उत्पादन SELECT ...

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

@ फ़हाद एक जोड़े नोट्स; 1) चूंकि आप [डीटी] [डीटीओ] में [डीटी] से अलग [स्टार्ट] और [टूडेट] को स्टोर कर रहे हैं। [बुकिंग] आपको शायद [डीबीओ] होना चाहिए। [बुकिंग]। [डीटी] 'DATE' डेटाटाइप' और स्पॉट में @ डीटी वैरिएबल 'VARCHAR' की बजाय' DATETIME' (वर्तमान) या 'DATE' (यदि आप इसे बदलना चाहते थे) होना चाहिए क्योंकि इसे b.dt की तुलना करने के लिए 'IMPLICIT_CONVERSION' करना है @ डीटी; 2) यह वर्तमान डिज़ाइन परिदृश्य को कवर नहीं करता है जहां बुकिंग एक दिन शुरू होती है और दूसरे पर समाप्त होती है, मैं [दिनांक], [TIME], [TIME] से छुटकारा पाउंगा और इसके बजाय स्टार्टडेट और एंडडेट के लिए दो [DATETIME] कॉलम का उपयोग करूंगा । –

संबंधित मुद्दे