Home Forums SQL Server 7,2000 T-SQL Help in writing Query for hall booking date availability search RE: Help in writing Query for hall booking date availability search

  • Sorry, no time for putting proper comments in there, I hope you can figure it out yourself.

    Column N_Date in table Tally contains all sequential dates from '1900-01-01' to '2076-12-31'.

    select H.hallId, T.N_Date, DATEADD(n, H.hallStartingTime, T.N_Date) Avail_From, ISNULL(MIN(B.startDatetime), DATEADD(n, H.hallClosingTime, T.N_Date) ) AS Avail_To

    -- from beginning of the day to the next appointment

    from Halls H

    INNER JOIN dbo.Tally T ON T.N_Date >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE())/7*7, 0) AND T.N_Date < DATEADD(dd, (DATEDIFF(dd, 0, GETDATE())/7+1)*7, 0)

    left join Hallbooking B ON H.hallId = B.hallId AND B.startDatetime > T.N_Date AND B.startDatetime < T.N_Date+1

    AND B.startDatetime > DATEADD(n, H.hallStartingTime, T.N_Date)

    GROUP BY H.hallId, H.hallClosingTime, H.hallStartingTime, T.N_Date

    UNION

    select H.hallId, T.N_Date, ISNULL(MAX(B.endDatetime), DATEADD(n, H.hallStartingTime, T.N_Date)) AS Avail_From, DATEADD(n, H.hallClosingTime, T.N_Date) Avail_To

    -- from the last appointment to end of the day

    from Halls H

    INNER JOIN dbo.Tally T ON T.N_Date >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE())/7*7, 0) AND T.N_Date < DATEADD(dd, (DATEDIFF(dd, 0, GETDATE())/7+1)*7, 0)

    left join Hallbooking B ON H.hallId = B.hallId AND B.endDatetime > T.N_Date AND B.endDatetime < T.N_Date+1

    AND B.endDatetime < DATEADD(n, H.hallClosingTime, T.N_Date)

    GROUP BY H.hallId, H.hallStartingTime, H.hallClosingTime, T.N_Date

    UNION

    select B1.hallId, T.N_Date, B1.endDatetime AS Avail_From, MIN(B2.startDatetime) Avail_To

    -- slots between appointments

    from dbo.Tally T

    INNER join Hallbooking B1 ON B1.endDatetime > T.N_Date AND B1.endDatetime < T.N_Date+1

    INNER JOIN Hallbooking B2 ON B2.hallId = B1.hallId AND B2.startDatetime > B1.endDatetime AND B2.endDatetime < T.N_Date+1

    WHERE T.N_Date >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE())/7*7, 0) AND T.N_Date < DATEADD(dd, (DATEDIFF(dd, 0, GETDATE())/7+1)*7, 0)

    GROUP BY B1.hallId, B1.endDatetime, T.N_Date

    ORDER BY H.hallId, Avail_From, Avail_To

    I believe this returns availability slots you were looking for.

    _____________
    Code for TallyGenerator