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.
答案 0 :(得分:1)
我认为您需要从
更改ifIF((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
介于StartDate
和EndDate
之间并测试=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
(适当调整<
至<=
,具体取决于您是否要考虑两个句点,以便一个句点从另一个句点完成时开始重叠或不重叠)
逻辑是 - 如果满足以下两个条件,则两个句点重叠:
其他说明 -
COUNT
永远不会成为<0
,因此部分逻辑不正确。如果您只想确定是否存在任何行,请使用EXISTS
(正如您已经拥有的那样) - 如果您实际上不需要知道多少<{1}},请不要强制使用COUNT
/ em>行符合您的条件。
我还发现有点怀疑你的第一个查询是PlanName
但是你的第二个查询没有。你确定这是正确的吗?