Sql server 日期存在于不起作用的日期范围之间

Sql server 日期存在于不起作用的日期范围之间,sql-server,Sql Server,我正在尝试实现以下目标。我想检查用户提供的startDate和Enddate是否位于现有表startDate和Enddate之间。如果用户提供的日期范围的任何日期介于表开始日期和结束日期之间,则应返回-2,如果记录不存在,则应插入详细信息 我无法理解这个逻辑。我错在哪里了。请给我建议解决这个问题的方法 编辑:首先检查planName是否存在,如果不存在,则检查开始和结束日期是否已存在,包括开始和结束日期 我尝试了答复中提到的两种方法 例如:如果现有的开始和结束日期范围为开始日期2013-10-0

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

我无法理解这个逻辑。我错在哪里了。请给我建议解决这个问题的方法

编辑:首先检查planName是否存在,如果不存在,则检查开始和结束日期是否已存在,包括开始和结束日期 我尝试了答复中提到的两种方法

例如:如果现有的开始和结束日期范围为开始日期2013-10-09,结束日期2013-10-15,如果我要插入另一个计划,那么该计划的开始和结束日期不应在10月9日至15日之间,开始和结束日期不应同时为9日或15日

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*永远不能像代码所建议的那样小于零。 它要么是大于零的正整数,要么是null,在任何算术条件下都会返回false。

COUNT*永远不能像代码所建议的那样小于零。
它要么是大于零的正整数,要么是null,在任何算术条件下都会返回false。

我认为您需要将if从

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.


这应该确保@StartDate和@EndDate介于StartDate和EndDate之间,并且test for=0

我认为您需要从

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.

应确保@StartDate和@EndDate介于StartDate和EndDate之间,并测试为=0

请尝试以下操作:

IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate >= @EndDate)=0)
As count始终返回正值或零。所以你的第一个条件总是错误的

*更新:* 如果您想说Sdate是'12-12-2013',edate是'15-12-2013',那么您不想在检查中考虑这些日期,如果是,那么请尝试用以下内容替换查询:

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
请尝试以下方法:

IF((SELECT COUNT(*) FROM tblPlan WHERE StartDate <= @StartDate  AND EndDate >= @EndDate)=0)
As count始终返回正值或零。所以你的第一个条件总是错误的

*更新:* 如果您想说Sdate是'12-12-2013',edate是'15-12-2013',那么您不想在检查中考虑这些日期,如果是,那么请尝试用以下内容替换查询:

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列中的值定义的任何周期重叠,则要执行的实际比较是:

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

如果要检查@StartDate、@EndDate定义的周期是否与特定行的StartDate、EndDate列中的值定义的任何周期重叠,则要执行的实际比较是:

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

对启动日期StdReST进行适当的调整,如果不仅要在包含开始日期和结束日期的范围内做什么?如果不仅要在包含开始日期和结束日期的范围内做什么?谢谢回复…如果我在已经存在的范围内插入日期,它将不插入…这里我想考虑开始日期和结束日期……开始和结束日期..嗨,raman,即使当前的开始和结束日期在已经存在的日期范围内,它也会不断插入数据..@kida请解释这些情况,以便我们可以一次性找到解决方案。。。请编辑您的问题,并添加日期的例子来回答……如果我在已经存在的范围内插入日期,它将不插入…这里我要考虑开始和结束日期……包括开始和结束日期。即使当前的开始和结束日期在已经存在的日期范围内,它也会不断插入数据。@kida请解释这些情况,以便我们可以一次找到解决方案。。。请编辑您的问题并添加日期示例