1
ALTER PROCEDURE [dbo].[spInsert]
(@PlanName Varchar(50)=null
,@StartDate Datetime
,@EndDate Datetime
,@ModifiedBy Varchar(100)=null
,@ReturnValue Int Out)
As
BEGIN
IF NOT EXISTS(SELECT PlanName FROM dbo.tblPlan WHERE PlanName=@PlanName) 
BEGIN 
IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate <=
    @EndDate)<0)
 BEGIN
 INSERT INTO dbo.tblPlan VALUES(3,@PlanName,@StartDate,@EndDate,@ModifiedBy,GETDATE(), 
       (SELECT DATEDIFF(DD,@StartDate,@EndDate)))
 SET @ReturnValue=1;
 END
ELSE
SET @ReturnValue=-2;
END
ELSE
SET @ReturnValue=-1;
END

我正在尝试实现以下目标。我想检查用户提供的 startDate 和 Enddate 是否在现有表 startdate 和 enddate 之间。如果用户提供的日期范围内的任何日期在表的开始日期和结束日期之间,它应该返回 -2,如果记录不存在,它应该插入详细信息..

我无法实现这个逻辑。我哪里出错了......请建议我对此的任何解决方案。

编辑:首先检查 planName 是否存在,如果不存在,则要检查开始和结束日期是否已经存在(包括开始和结束)我尝试了回复中建议的两种方法。

例如:如果现有的开始和结束范围是 Start-2013-10-09,End-2013-10-15,如果要插入另一个计划,则该计划的开始和结束日期不应介于 10 月 9 日至 15 日之间开始和结束日期不应该是 9 日或 15 日。

ONE:IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate <= 
  @EndDate)=0)

 Result: It does not insert any data, even it is out of previous date. or with in the
 range

 SECOND:IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate>=@StartDate AND 

 EndDate<=@EndDate)=0)

 RESULT: It insert the date with out Considering the above condition.
4

4 回答 4

1

我认为你需要改变你的 if 从

IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate <= @EndDate)<0)

IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate >= @EndDate)=0)

应该确保@StartDateand@EndDate介于StartDateandEndDate和之间=0

于 2013-10-07T05:05:38.630 回答
0

试试下面的:

ALTER PROCEDURE [dbo].[spInsert]
(@PlanName Varchar(50)=null
,@StartDate Datetime
,@EndDate Datetime
,@ModifiedBy Varchar(100)=null
,@ReturnValue Int Out)
As
BEGIN
IF NOT EXISTS(SELECT PlanName FROM dbo.tblPlan WHERE PlanName=@PlanName) 
BEGIN 
IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate >= @StartDate  AND EndDate <=
@EndDate)=0)
BEGIN INSERT INTO dbo.tblPlan
VALUES(3,@PlanName,@StartDate,@EndDate,@ModifiedBy,GETDATE(), 
(SELECT DATEDIFF(DD,@StartDate,@EndDate)))
 SET @ReturnValue=1;
 END
ELSE
SET @ReturnValue=-2;
END
ELSE
SET @ReturnValue=-1;
END

因为 count 总是返回正值或零。所以你的第一个条件总是错误的。

*更新 * 你想说如果 Sdate 是 '12-12-2013' 并且 edate 是 '15-12-2013' 那么你不想考虑这些日期如果是这样的话,然后尝试用下面的查询替换:

IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate > @StartDate  AND EndDate <
@EndDate)=0)
于 2013-10-07T05:06:58.897 回答
0

如果您要检查由特定行定义的期间是否与由特定行@StartDate,@EndDate的列中的值定义的任何期间重叠StartDate,EndDate,那么您要执行的实际比较是:

StartDate < @EndDate AND EndDate < @StartDate

(适当调整<to<=取决于您是否要考虑两个时期,以便一个时期开始于另一个时期结束的确切时间重叠与否)

逻辑是 - 如果以下两个条件都为真,则两个周期重叠:

  • 第 1 期在第 2 期结束之前开始
  • 第 2 期在第 1 期结束之前开始

其他注意事项——

ACOUNT永远不会使<0部分逻辑不正确。如果您只想确定是否存在任何行,请使用EXISTS(因为您已经有一次) -COUNT如果您实际上不需要知道有多少行符合您的条件,请不要强制使用。

我还发现它有点怀疑您的第一个查询考虑PlanName但您的第二个没有考虑。你确定这是正确的吗?

于 2013-10-07T05:58:11.467 回答
0

COUNT(*)永远不能像您的代码建议的那样小于零。它要么是一个正整数(大于零),要么是null,它也将false在任何算术条件下返回。

于 2013-10-07T05:03:53.720 回答