Solved

How I can get the first timeslot?

Posted on 2009-07-08
5
356 Views
Last Modified: 2012-05-07
I have created a calendar, time slots and appointment tables to try to manage appointments.

The Calendar table has been filled with the dates from 20000101' to '20291231'. The Timeslot table has been filled with a time slots of ten minutes for every date in the Calendar table (144 slots for each calendar date).

I need to know how I can get the first available appointment for a given duration and physicianId?

Thank you.

Calendar Table:
CREATE TABLE [Calendars].[Calendar](
	[CalDate] [date] NOT NULL,
	[isWeekday] [bit] NULL,
	[isHoliday] [bit] NULL,
	[Y] [smallint] NULL,
	[FY] [smallint] NULL,
	[Q] [tinyint] NULL,
	[M] [tinyint] NULL,
	[D] [tinyint] NULL,
	[DW] [tinyint] NULL,
	[monthname] [varchar](9) NULL,
	[dayname] [varchar](9) NULL,
	[W] [tinyint] NULL,
	[UTCOffset] [tinyint] NULL,
	[HolidayDescription] [varchar](32) NULL,
PRIMARY KEY CLUSTERED 
(
	[CalDate] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
TimeSlots Table:
CREATE TABLE [Calendars].[TimeSlot](
	[SlotId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[CalDate] [date] NOT NULL,
	[SlotTime] [datetime] NOT NULL,
 CONSTRAINT [PK_TimeSlots] PRIMARY KEY CLUSTERED 
(
	[SlotId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
Appointment Table:
CREATE TABLE [Appointments].[Appointment](
	[AppointmentId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
	[AppointmentDate] [date] NOT NULL,
	[BegTime] [datetime] NOT NULL,
	[EndTime] [datetime] NOT NULL,
	[Duration] [int] NOT NULL,
	[PhysicianId] [int] NOT NULL,
	[FileId] [int] NOT NULL,
	[RoomId] [int] NULL,
	[ProcedureId] [int] NOT NULL,
	[VisitStatusId] [int] NOT NULL,
	[ConfirmId] [int] NOT NULL,
	[IsArrived] [bit] NOT NULL,
	[IsRowDeleted] [bit] NOT NULL,
 CONSTRAINT [PK_Appointments] PRIMARY KEY CLUSTERED 
(
	[AppointmentId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Open in new window

0
Comment
Question by:Samijf
  • 4
5 Comments
 
LVL 42

Accepted Solution

by:
pcelba earned 500 total points
ID: 24813334
The following code shows how to obtain the nearest gap. If you need some time difference between now and the nearest gap starting time then you have to change the GETDATE() by e.g. DATEADD(minute, 30, GETDATE()).

DECLARE @PhysicianId int
DECLARE @DurationInMinutes int
SET @PhysicianId = <>
SET @DurationInMinutes = <>
 
SELECT ISNULL(MIN(a1.EndTime), GETDATE()) FirstGapStart 
  FROM [Appointments].[Appointment] a1 
 WHERE a1.PhysicianId = @PhysicianId AND 
       a1.EndTime > GETDATE() AND 
       NOT EXISTS (SELECT BegTime 
                     FROM [Appointments].[Appointment] 
                    WHERE PhysicianId = @PhysicianId AND 
                          BegTime < DATEADD(minute, @DurationInMinutes, a1.EndTime) AND 
                          BegTime > a1.EndTime)

Open in new window

0
 
LVL 42

Assisted Solution

by:pcelba
pcelba earned 500 total points
ID: 24813383
But you are asking for the first available appointment not for the gap to create new appointment, so it is even easier:

SELECT MIN(a1.BegTime) FirstAppointment
  FROM [Appointments].[Appointment] a1
 WHERE a1.PhysicianId = @PhysicianId AND
       a1.BegTime > GETDATE()  

0
 
LVL 42

Expert Comment

by:pcelba
ID: 24813466
To look for the first available gaps is more probable. If you need to round the time of the first available gap to your Slots then you may simply use above gap calcuation as subquery for slot time selection:


DECLARE @PhysicianId int
DECLARE @DurationInMinutes int
SET @PhysicianId = <>
SET @DurationInMinutes = <>
 
SELECT MIN(SlotTime) SlotGapStart 
  FROM [Calendars].[TimeSlot] 
 WHERE SlotTime >= (
       SELECT ISNULL(MIN(a1.EndTime), GETDATE()) FirstGapStart 
         FROM [Appointments].[Appointment] a1 
        WHERE a1.PhysicianId = @PhysicianId AND 
              a1.EndTime > GETDATE() AND 
              NOT EXISTS (SELECT BegTime 
                            FROM [Appointments].[Appointment] 
                           WHERE PhysicianId = @PhysicianId AND 
                                 BegTime < DATEADD(minute, @DurationInMinutes, a1.EndTime) AND 
                                 BegTime > a1.EndTime)
       )

Open in new window

0
 

Author Comment

by:Samijf
ID: 25138282
Hi,
I'm sorry for my late replay but I was really busy with other things that my priorities force me to do.

I did try all of the select statement giving by you and the first one work with me but I need to conceder other issues.

The following is the SQL stamen I use which given to me by "pcelba".

DECLARE @PhysicianId int = 1
DECLARE @DurationInMinutes int = 10

SELECT ISNULL(MIN(a1.EndTime), GETDATE()) FirstGapStart
  FROM [CMS].[Appointments].[Appointment] a1
 WHERE a1.PhysicianId = @PhysicianId
   AND a1.EndTime > GETDATE()
   AND NOT EXISTS (SELECT BegTime
                     FROM [CMS].[Appointments].[Appointment]
                    WHERE PhysicianId = @PhysicianId
                      AND BegTime < DATEADD(minute, @DurationInMinutes, a1.EndTime)
                      AND BegTime > a1.EndTime)

It works fine.

But I need also to return the first three available appointments and they must be within the physician working hours.

For example Physician No 1 works time:
From 10:00 AM To 01:00 PM
FROM 04:00 PM  To  10:00 PM
 
Please I need your help.

Thank you.
0
 
LVL 42

Expert Comment

by:pcelba
ID: 25138351
To implement physician working hours you need to define/disclose table which will contain these data.

The best thing you coud do now is to close this question and start a new one. It will fullfil EE rules and ensure fast answer.
0

Featured Post

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
This article shows gives you an overview on SQL Server 2016 row level security. You will also get to know the usages of row-level-security and how it works
Familiarize people with the process of retrieving data from SQL Server using an Access pass-thru query. Microsoft Access is a very powerful client/server development tool. One of the ways that you can retrieve data from a SQL Server is by using a pa…
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties

790 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question