基于选择的半小时和一小时时段预订- c# 和 sql
HALF-an-hour and One-hour time slot booking based on selection- c# and sql
我无法找到特定治疗的半小时和一小时时段的可用时间 - 在选定的日期。
用户可以在预订结束时选择半小时和一小时
示例 = 在选定日期 - 上午 9 点预订 1 小时(上午 9 点至上午 10 点)
还有另一个预订 - 上午 11 点半小时(上午 11 点至 11:30am)
那么用户不应该在同一天看到这两个时段
他应该在显示器上看到这个(在选择了处理器和日期之后)
半小时:
- 上午 9 点到 930 点 ❌(不可用)
- 上午 930 点至上午 10 点 ❌(不可用)
- 上午 10 点到 1030 ✅(可用)
- 1030 到上午 11 点 ✅(可用)
- 上午 11 点到 11:30 ❌(不可用)
11:30 至 1200pm ✅ (有空)
等等...................
.
一小时
上午 9 点到 10 点 ❌(不可用)
- 上午 10 点至上午 11 点 ✅(可用)
- 11am 到 12pm ❌(不可用),(((((如果可能的话,我们可以在上午 1130 点到 12:30pm ✅(可用),然后序列从 12:30 继续,依此类推....)))
- 12pm 至 1pm ✅(可用)
下午1点到2点✅(有空)
等等------------------------
我试过这样做。
我创建了两个 tables - 一个用于半小时时段,一个用于一小时时段。
这两个table有timebegin和timeEnd
我还有一个 table 已经预订了条目。
我在 SQl 中尝试使用 EXCEPT - 但似乎给出了错误的结果
SELECT T1.timeBegin from ClinicNew.HalfTiming T1
left join ClinicNew.FullTiming T2
On T1.TimeBegin=T2.TimeBegin
EXCEPT
select distinct T1.timeBegin from ClinicNew.HalfTiming T1
inner join ClinicNew.NewTreaterEngagedDTM T2
On T1.timeBegin = T2.timeBegin
where T2.BookedDate = '2014-04-15'
and T2.TreaterID=
请帮忙
我认为您可能将多个 table 用于不同长度的时隙,从而使这个变得过于复杂。如果您想以 15 分钟为间隔而不是 30 分钟,会发生什么情况?当您想允许 90 分钟的约会时会发生什么?如果安排这些约会的办公室在不同的日子有不同的时间会怎样?
我在下面提出的解决方案使用一个 table 来存储约会,仅此而已。显示的其余逻辑可以很容易地进入存储过程或当您需要给定日期的可用约会列表时调用的东西。希望评论足以解释发生了什么。
-- Sample data from the question.
declare @Appointment table
(
[ID] bigint not null identity(1, 1), -- Primary key.
[BookedDate] date not null, -- The date of the appointment.
[Time] time(0) not null, -- The start time of the appointment.
[Duration] int not null -- The length of the appointment in minutes.
);
insert @Appointment
([BookedDate], [Time], [Duration])
values
('2014-04-15', '09:00', 60),
('2014-04-15', '10:00', 30),
('2014-04-15', '17:00', 60),
('2014-04-15', '18:30', 30);
-- @StartTime is the time the office opens on the desired date.
-- @EndTime is the time the office closes on the desired date.
-- @Interval is the number of minutes that separate potential appointment times.
-- @DesiredDate is the date on which an appointment is requested.
-- @DesiredLength is the length of the requested appointment in minutes.
declare @StartTime time(0) = '09:00';
declare @EndTime time(0) = '21:00';
declare @Interval int = 30;
declare @DesiredDate date = '2014-04-15';
declare @DesiredLength int = 30;
-- This CTE enumerates all potential timeslots on the @DesiredDate given the above data.
with [TimeSlotCTE] as
(
-- Base case: the first appointment slot of the day.
select
[From] = @StartTime,
[To] = dateadd(minute, @DesiredLength, @StartTime)
union all
-- Recursive case: create a subsequent appointment slot as long as doing so won't
-- take us past the office's closing time.
select
dateadd(minute, @Interval, [From]),
dateadd(minute, @Interval, [To])
from
[TimeSlotCTE]
where
dateadd(minute, @Interval, [To]) <= @EndTime
)
-- Finally, we simply select every time slot defined above for which there does not
-- yet exist an overlapping appointment on the requested date.
select
[T].[From],
[T].[To],
[Available] =
case when exists
(
select 1 from @Appointment [A]
where
-- Forgot this line the first time around!
[A].[BookedDate] = @DesiredDate and
[A].[Time] < [T].[To] and
dateadd(minute, [A].[Duration], [A].[Time]) > [T].[From]
)
then 'No' else 'Yes' end
from
[TimeSlotCTE] [T];
如果我 运行 上面的代码 @DesiredLength = 30
:
From To Available
09:00:00 09:30:00 No
09:30:00 10:00:00 No
10:00:00 10:30:00 No
10:30:00 11:00:00 Yes
11:00:00 11:30:00 Yes
11:30:00 12:00:00 Yes
12:00:00 12:30:00 Yes
12:30:00 13:00:00 Yes
13:00:00 13:30:00 Yes
13:30:00 14:00:00 Yes
14:00:00 14:30:00 Yes
14:30:00 15:00:00 Yes
15:00:00 15:30:00 Yes
15:30:00 16:00:00 Yes
16:00:00 16:30:00 Yes
16:30:00 17:00:00 Yes
17:00:00 17:30:00 No
17:30:00 18:00:00 No
18:00:00 18:30:00 Yes
18:30:00 19:00:00 No
19:00:00 19:30:00 Yes
19:30:00 20:00:00 Yes
20:00:00 20:30:00 Yes
20:30:00 21:00:00 Yes
这是 @DesiredLength = 60
:
From To Available
09:00:00 10:00:00 No
09:30:00 10:30:00 No
10:00:00 11:00:00 No
10:30:00 11:30:00 Yes
11:00:00 12:00:00 Yes
11:30:00 12:30:00 Yes
12:00:00 13:00:00 Yes
12:30:00 13:30:00 Yes
13:00:00 14:00:00 Yes
13:30:00 14:30:00 Yes
14:00:00 15:00:00 Yes
14:30:00 15:30:00 Yes
15:00:00 16:00:00 Yes
15:30:00 16:30:00 Yes
16:00:00 17:00:00 Yes
16:30:00 17:30:00 No
17:00:00 18:00:00 No
17:30:00 18:30:00 No
18:00:00 19:00:00 No
18:30:00 19:30:00 No
19:00:00 20:00:00 Yes
19:30:00 20:30:00 Yes
20:00:00 21:00:00 Yes
这样的事情对你有用吗?
我无法找到特定治疗的半小时和一小时时段的可用时间 - 在选定的日期。 用户可以在预订结束时选择半小时和一小时 示例 = 在选定日期 - 上午 9 点预订 1 小时(上午 9 点至上午 10 点) 还有另一个预订 - 上午 11 点半小时(上午 11 点至 11:30am) 那么用户不应该在同一天看到这两个时段 他应该在显示器上看到这个(在选择了处理器和日期之后)
半小时:
- 上午 9 点到 930 点 ❌(不可用)
- 上午 930 点至上午 10 点 ❌(不可用)
- 上午 10 点到 1030 ✅(可用)
- 1030 到上午 11 点 ✅(可用)
- 上午 11 点到 11:30 ❌(不可用)
11:30 至 1200pm ✅ (有空) 等等................... .
一小时
上午 9 点到 10 点 ❌(不可用)
- 上午 10 点至上午 11 点 ✅(可用)
- 11am 到 12pm ❌(不可用),(((((如果可能的话,我们可以在上午 1130 点到 12:30pm ✅(可用),然后序列从 12:30 继续,依此类推....)))
- 12pm 至 1pm ✅(可用)
下午1点到2点✅(有空) 等等------------------------
我试过这样做。
我创建了两个 tables - 一个用于半小时时段,一个用于一小时时段。
这两个table有timebegin和timeEnd
我还有一个 table 已经预订了条目。
我在 SQl 中尝试使用 EXCEPT - 但似乎给出了错误的结果
SELECT T1.timeBegin from ClinicNew.HalfTiming T1
left join ClinicNew.FullTiming T2
On T1.TimeBegin=T2.TimeBegin
EXCEPT
select distinct T1.timeBegin from ClinicNew.HalfTiming T1
inner join ClinicNew.NewTreaterEngagedDTM T2
On T1.timeBegin = T2.timeBegin
where T2.BookedDate = '2014-04-15'
and T2.TreaterID=
请帮忙
我认为您可能将多个 table 用于不同长度的时隙,从而使这个变得过于复杂。如果您想以 15 分钟为间隔而不是 30 分钟,会发生什么情况?当您想允许 90 分钟的约会时会发生什么?如果安排这些约会的办公室在不同的日子有不同的时间会怎样?
我在下面提出的解决方案使用一个 table 来存储约会,仅此而已。显示的其余逻辑可以很容易地进入存储过程或当您需要给定日期的可用约会列表时调用的东西。希望评论足以解释发生了什么。
-- Sample data from the question.
declare @Appointment table
(
[ID] bigint not null identity(1, 1), -- Primary key.
[BookedDate] date not null, -- The date of the appointment.
[Time] time(0) not null, -- The start time of the appointment.
[Duration] int not null -- The length of the appointment in minutes.
);
insert @Appointment
([BookedDate], [Time], [Duration])
values
('2014-04-15', '09:00', 60),
('2014-04-15', '10:00', 30),
('2014-04-15', '17:00', 60),
('2014-04-15', '18:30', 30);
-- @StartTime is the time the office opens on the desired date.
-- @EndTime is the time the office closes on the desired date.
-- @Interval is the number of minutes that separate potential appointment times.
-- @DesiredDate is the date on which an appointment is requested.
-- @DesiredLength is the length of the requested appointment in minutes.
declare @StartTime time(0) = '09:00';
declare @EndTime time(0) = '21:00';
declare @Interval int = 30;
declare @DesiredDate date = '2014-04-15';
declare @DesiredLength int = 30;
-- This CTE enumerates all potential timeslots on the @DesiredDate given the above data.
with [TimeSlotCTE] as
(
-- Base case: the first appointment slot of the day.
select
[From] = @StartTime,
[To] = dateadd(minute, @DesiredLength, @StartTime)
union all
-- Recursive case: create a subsequent appointment slot as long as doing so won't
-- take us past the office's closing time.
select
dateadd(minute, @Interval, [From]),
dateadd(minute, @Interval, [To])
from
[TimeSlotCTE]
where
dateadd(minute, @Interval, [To]) <= @EndTime
)
-- Finally, we simply select every time slot defined above for which there does not
-- yet exist an overlapping appointment on the requested date.
select
[T].[From],
[T].[To],
[Available] =
case when exists
(
select 1 from @Appointment [A]
where
-- Forgot this line the first time around!
[A].[BookedDate] = @DesiredDate and
[A].[Time] < [T].[To] and
dateadd(minute, [A].[Duration], [A].[Time]) > [T].[From]
)
then 'No' else 'Yes' end
from
[TimeSlotCTE] [T];
如果我 运行 上面的代码 @DesiredLength = 30
:
From To Available
09:00:00 09:30:00 No
09:30:00 10:00:00 No
10:00:00 10:30:00 No
10:30:00 11:00:00 Yes
11:00:00 11:30:00 Yes
11:30:00 12:00:00 Yes
12:00:00 12:30:00 Yes
12:30:00 13:00:00 Yes
13:00:00 13:30:00 Yes
13:30:00 14:00:00 Yes
14:00:00 14:30:00 Yes
14:30:00 15:00:00 Yes
15:00:00 15:30:00 Yes
15:30:00 16:00:00 Yes
16:00:00 16:30:00 Yes
16:30:00 17:00:00 Yes
17:00:00 17:30:00 No
17:30:00 18:00:00 No
18:00:00 18:30:00 Yes
18:30:00 19:00:00 No
19:00:00 19:30:00 Yes
19:30:00 20:00:00 Yes
20:00:00 20:30:00 Yes
20:30:00 21:00:00 Yes
这是 @DesiredLength = 60
:
From To Available
09:00:00 10:00:00 No
09:30:00 10:30:00 No
10:00:00 11:00:00 No
10:30:00 11:30:00 Yes
11:00:00 12:00:00 Yes
11:30:00 12:30:00 Yes
12:00:00 13:00:00 Yes
12:30:00 13:30:00 Yes
13:00:00 14:00:00 Yes
13:30:00 14:30:00 Yes
14:00:00 15:00:00 Yes
14:30:00 15:30:00 Yes
15:00:00 16:00:00 Yes
15:30:00 16:30:00 Yes
16:00:00 17:00:00 Yes
16:30:00 17:30:00 No
17:00:00 18:00:00 No
17:30:00 18:30:00 No
18:00:00 19:00:00 No
18:30:00 19:30:00 No
19:00:00 20:00:00 Yes
19:30:00 20:30:00 Yes
20:00:00 21:00:00 Yes
这样的事情对你有用吗?