【问题标题】:SQL DateTime comparingSQL 日期时间比较
【发布时间】:2014-09-11 22:46:47
【问题描述】:

我有一个日历,用户可以在其中创建约会,我不希望重复预订,也不希望预订相互重叠。

我认为要实现这一点,以下逻辑可以解决问题。

在以下情况下不允许预订:

@StartDateRequested = Appointments.EndDate @StartDateRequested >= Appointments.StartDate AND EndDateRequested

这应该停止在另一个预订开始和结束内的预订,并停止在之前和之后开始的预订。

这是我尝试过的:

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 日期时间逻辑关闭了。

在我的数据库中,我有一个从 12:00 到 12:55 开始的约会,您将在我的测试值中看到我正在尝试检查是否可以创建一个 11:00 到 13:55 的约会,这个不应该让我这样做。

【问题讨论】:

    标签: sql datetime operators


    【解决方案1】:

    我最后使用的逻辑是这样的:

    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)
    )
    

    【讨论】:

      【解决方案2】:

      这种时间重叠的逻辑是,当一个在另一个结束之前开始并且在第一个开始之后另一个结束时存在重叠。以下逻辑返回重叠:

      WHERE (@ScheduledStart <= A.ScheduledEnd AND
             @ScheduledEnd >= A.ScheduledStart
            )
      

      以下返回不重叠:

      WHERE (@ScheduledStart > A.ScheduledEnd OR
             @ScheduledEnd < A.ScheduledStart
            )
      

      【讨论】:

      • 我不能这样,它会返回之前开始的每个约会以及之后开始的每个约会。
      • @Pomster 。 . .第一个查询应该返回所有重叠的约会。如果我理解你的逻辑,那就是你想要的。
      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多