日期范围之间存在日期不起作用

时间:2013-10-07 05:00:45

标签: sql-server

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,如果记录不存在则应插入详细信息..

我无法达到这个逻辑。我出错了..请给我任何解决方案。

EDIT:First Consditon检查planName是否存在,如果不存在则想检查已存在的开始和结束日期或不存在(包括开始和结束) 我按照回复中提到的建议尝试了两种方法。

例如:如果现有的开始和结束范围是Start-2013-10-09,End-2013-10-15,如果要插入另一个计划,那么该计划的开始和结束日期不应该介于9日之间10月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 个答案:

答案 0 :(得分: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)

哪个应确保@StartDate@EndDate介于StartDateEndDate之间并测试=0

答案 1 :(得分:0)

COUNT(*)可以从不小于零,就像您的代码所暗示的那样。 它是一个正整数(大于零)或null,它也会在任何算术条件下返回false

答案 2 :(得分: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

由于计数始终返回正值或零。所以你的第一个条件总是假的。

*的 更新 * 你想说如果Sdate是'12 -12-2013'并且edate是'15 -12-2013'那么你不想在检查中考虑这些日期,如果是这样,那么尝试用以下代替查询:

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

答案 3 :(得分:0)

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

StartDate < @EndDate AND EndDate < @StartDate

(适当调整<<=,具体取决于您是否要考虑两个句点,以便一个句点从另一个句点完成时开始重叠或不重叠)

逻辑是 - 如果满足以下两个条件,则两个句点重叠:

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

其他说明 -

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

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