SQL Server-为值范围添加检查约束

时间:2014-12-19 22:14:09

标签: sql-server stored-procedures constraints

好的,我在创建插入存储过程时遇到问题。这个程序必须对输入的数据进行chekc,对一个表,然后插入另一个表。我设计了3个表,时间,可用性和联系可用性。此存储过程仅关注时间和联系可用性表。

时间表

TimeID Time1 Time2

    1. 8:30 am 8:59 am< ----两个时间列都是varchar并设置为唯一
    1. 上午9:00 9:29
    1. 9:30 am 9:59 am

时间以半小时为间隔,直到晚上530点,这意味着18次Id。

联系可用性表

ID日期时间可用性

  • 1094 2014-12-12 1 1
  • 1094 2014-12-12 2 1
  • 1094 2014-12-12 3 2
  • 1094 2014-12-12 4 2 等...

时间列的值与时间表中的timeID重合。

这是使用输入值搜索联系人可用性的存储过程:

  @date date,
  @time varchar(50),
  @lastname varchar(50)
  As
  SELECT    d.Date ,
            d.ContactID ,
            c.FirstName ,
            c.LastName ,
            a.Availability
  FROM      Daniel_Availability a
            JOIN Daniel_AvailabilityStatus d ON a.AVID = d.Availability
            JOIN Daniel_Time t ON d.Time = t.TID
            JOIN Contact c ON d.ContactID = c.ContactID
  WHERE     ( ( t.Time1 < @time )
              AND ( t.time2 > @time )
            )
            AND @lastname = c.lastname
            AND @date = d.Date

我想要完成的是创建一个存储过程以允许用户在Time表中插入新的半小时时间范围,但新时间范围不能与已存在的时间重复或冲突。例如,用户应该能够在上午7点至7点30分添加范围。用户不应该能够添加830am-9am范围,因为它已经存在,并且用户不应该能够添加830am-845am,因为已经有830am-859am范围。我希望我所要求的是有道理的。

1 个答案:

答案 0 :(得分:0)

您最大的问题是时间列存储为varchar。比较2个varchars(或者整数,或者&#34; time&#34;在这种情况下会得到错误的结果.varchar排序顺序将类似于0,1,10,11,12,13,14,15,16, 17,18,19,2,20,21,22,23,3,4,5,6,7,8,9 所以,鉴于此,上午10:00将不到上午9:00。如果你在表格中加上0的前缀,那么你会有更好的运气,所以08:00,08:30 ......

更好的方法是建立一个合适的日期时间,然后传入适当的日期时间进行比较,这样你就可以试试......

  @StartDate DATETIME,  --<-- This full datetime you want to check like '2014-01-01 08:30'
  @lastname varchar(50)
  As

  DECLARE @CheckDate VARCHAR(10) = CONVERT(VARCHAR(10), @Date, 121),
          @EndDate   DATETIME = DATEADD(MINUTE, 30, @Date)

  SELECT    d.Date ,
            d.ContactID ,
            c.FirstName ,
            c.LastName ,
            a.Availability
  FROM      Daniel_Availability a
            JOIN Daniel_AvailabilityStatus d ON a.AVID = d.Availability
            JOIN Daniel_Time t ON d.Time = t.TID
            JOIN Contact c ON d.ContactID = c.ContactID
  WHERE c.lastname = @lastname
  AND d.Date = CONVERT(DATE, @StartDate)
  AND (
        @StartDate BETWEEN 
            CONVERT(DATETIME, @CheckDate + ' ' + t.Time1) 
        AND CONVERT(DATETIME, @CheckDate + ' ' + t.Time2)
  OR    @EndDate BETWEEN
            CONVERT(DATETIME, @CheckDate + ' ' + t.Time1) 
        AND CONVERT(DATETIME, @CheckDate + ' ' + t.Time2)
  )

为此,您需要确保日期&#39; 2014-01-01&#39;以及你在时间表中的所有内容&#39;上午8:30;&#39;可以转换为有效的日期时间。即SELECT CONVERT(DATETIME,&#39; 2014-01-01&#39; +&#39;&#39; +&#39; 8:30 am&#39;)