我有一个包含timesheet表的SQL Server数据库。此表用于存储员工的角色。在执行插入操作之前,我会检查员工在所选日期内是否有任何预先存在的角色。
下面是一个返回预先存在的角色计数的存储过程
set @retVal=(select count(fk_RoleID) from dbo.TimesheetTable where
(@startdate >= CAST((
STR( YEAR( StartDate ) ) + '/' +
STR( MONTH( StartDate ) ) + '/' +
STR( DAY( StartDate ) )
)
AS DATE
))-- AND EndDate <= '2012-08-30')
and
(@enddate < CAST(
(
STR( YEAR( EndDate ) ) + '/' +
STR( MONTH( EndDate ) ) + '/' +
STR( DAY( EndDate ) )
)
AS DATE
))
and fk_PersonnelID=@personnelID)
return @retVal以下是一名员工的记录。
pk_ID fk_PersonnelID fk_RoleID StartDate EndDate dateCreated
62 1 26 2012-10-01 2012-10-02 2012-10-25 15:55:12.940
81 1 20 2012-10-04 2012-10-06 2012-10-30 14:50:28.300如果我尝试执行开始日期为2012-10-05而结束日期为2012-10-11的插入,则查询无法捕获插入发生的startdate ..and
我做错了什么?
发布于 2012-10-31 02:25:03
您的重叠测试不正确。测试应该是“两个开始都在相反的结束之前到来”。记住,这很容易。
SELECT @retVal = CASE WHEN EXISTS (
select *
from dbo.TimesheetTable
where StartDate <= @EndDate
and @StartDate <= EndDate
and fk_PersonnelID=@personnelID) THEN 1 ELSE 0 END要测试是否存在,请切换到使用EXISTS,它将短路并在找到结果时立即给出结果,而不是COUNTing all matches。
发布于 2012-10-31 02:19:48
您不需要解析StartDate和EndDate列来获得所需的结果。
SELECT @retVal = COUNT(fk_RoleID)
FROM dbo.TimesheetTable AS tt
WHERE @startDate <= tt.EndDate
AND @endDate >= tt.StartDate
AND fk_PersonnelId = @personnelID;
return @retVal;对于在数据库中已经有计划的输入,@retVal在这里将返回一个大于0的数字。
发布于 2012-10-31 02:28:17
您的日期比较不等式中有一个逻辑错误,因为我认为您试图匹配的日期间隔范围是重叠的-没有正确包含-正如您的代码似乎假设的那样。
例如,10/4 - 10/6严格重叠10/5- 10/11,而您的代码暗示参数间隔必须完全位于数据行的间隔内。
https://stackoverflow.com/questions/13144970
复制相似问题