好的,我在创建插入存储过程时遇到问题。这个程序必须对输入的数据进行chekc,对一个表,然后插入另一个表。我设计了3个表,时间,可用性和联系可用性。此存储过程仅关注时间和联系可用性表。
时间表
TimeID Time1 Time2
时间以半小时为间隔,直到晚上530点,这意味着18次Id。
联系可用性表
ID日期时间可用性
时间列的值与时间表中的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范围。我希望我所要求的是有道理的。
答案 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;)