【问题标题】:Date Exists between Range of Dates not working日期范围之间的日期不工作
【发布时间】:2013-10-07 05:00:45
【问题描述】:
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,如果要插入另一个计划,则该计划的开始和结束日期不应介于 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.

【问题讨论】:

  • StartDate &lt;= @StartDate AND EndDate &lt;= @EndDate 检查这些条件不应该像StartDate &gt;= @StartDate AND EndDate &lt;= @EndDate

标签: sql-server


【解决方案1】:

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

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@EndDateStartDateEndDate 之间并测试=0

【讨论】:

  • 如果不仅要在包括开始和结束日期的范围内怎么办?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    试试下面的:

    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)
    

    【讨论】:

    • 感谢您的回复...如果我在已经存在的范围内插入日期,它将不会插入...这里我也想考虑开始和结束日期...包括开始和结束日期..
    • 嗨拉曼,即使当前开始和结束日期在已经存在的日期范围内,它也会继续插入数据..
    • @kida 请解释这些案例,以便我们可以寻求解决方案...请编辑您的问题并添加日期示例
    【解决方案4】:

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

    StartDate < @EndDate AND EndDate < @StartDate
    

    (将&lt; 适当调整为&lt;=,具体取决于您是否要考虑两个时段,以便一个时段开始于另一个时段结束的确切时间是否重叠)

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

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

    其他说明-

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

    我还发现您的第一个查询考虑了PlanName,但您的第二个却没有。你确定这是正确的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2021-11-16
      • 2020-07-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多