[英]SQL DateTime comparing
我有一个日历,用户可以在其中创建约会,我既不想重复预订,也不想重复预订。
我认为,要实现这一目标,可以使用以下逻辑。
在以下情况下不允许预订:
@StartDateRequested <= Appointments.StartDate和EndDateRequested> = Appointments.EndDate @StartDateRequested> = Appointments.StartDate AND EndDateRequested <= Appointments.EndDate
这应停止另一个预订开始和结束之内的预订,并停止之前和之后结束的预订。
这是我尝试过的:
DECLARE @ScheduledStart datetime2
SET @ScheduledStart = '2014/07/21 11:00:00 PM'
DECLARE @ScheduledEnd datetime2
SET @ScheduledEnd = '2014/07/21 13:55:00 PM'
DECLARE
@ErrorMessage varchar(128)
,@IsLocalTrans bit
DECLARE @Count int
SELECT
--@Count = COUNT(*)
A.AppointmentId
FROM
Appointment AS A WITH (NOLOCK)
WHERE
(
-- (@ScheduledStart BETWEEN A.ScheduledStart AND A.ScheduledEnd)
--OR
-- (@ScheduledEnd BETWEEN A.ScheduledStart AND A.ScheduledEnd)
--OR
(@ScheduledStart < A.ScheduledStart AND @ScheduledEnd > A.ScheduledEnd)
OR
(@ScheduledStart > A.ScheduledStart AND @ScheduledEnd < A.ScheduledEnd)
)
AND A.AppointmentStatusId = 2 --confirmed
失败了,它返回了3个约会,这些约会的开始和结束时间都比我尝试的日期的开始和结束时间长。
注释掉的代码可用于在另一个预订时段开始或结束预订时停止该预订,但不能满足重叠的预订。
我认为我处在正确的轨道上,只是我的sql datetime逻辑已关闭。
在我的数据库中,我的约会开始于12:00到12:55,您将在我的测试值中看到我正在尝试检查是否可以为11:00到13:55创建约会,这不应该允许我要这样做。
时间重叠的逻辑是,当一个在另一个结束之前开始,而另一个在第一次开始之后结束时,存在重叠。 以下逻辑返回重叠:
WHERE (@ScheduledStart <= A.ScheduledEnd AND
@ScheduledEnd >= A.ScheduledStart
)
以下返回非重叠:
WHERE (@ScheduledStart > A.ScheduledEnd OR
@ScheduledEnd < A.ScheduledStart
)
我最终使用的逻辑如下所示:
WHERE
(
(@ScheduledStart BETWEEN A.ScheduledStart AND A.ScheduledEnd)
OR
(@ScheduledEnd BETWEEN A.ScheduledStart AND A.ScheduledEnd)
OR
(A.ScheduledStart BETWEEN @ScheduledStart AND @ScheduledEnd)
OR
(A.ScheduledEnd BETWEEN @ScheduledStart AND @ScheduledEnd)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.