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 が存在するかどうかを確認します。存在しない場合は、開始日と終了日が既に存在するかどうか (開始と終了を含む) を確認します。返信に記載されているように、2 つの方法を試しました。

例: 既存の開始日と終了日の範囲が 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がandと test の@EndDate間にあることを確認する必要がありますStartDateEndDate=0

于 2013-10-07T05:05:38.630 に答える
0

COUNT(*)コードが示唆するように、ゼロよりも小さくなることはありません。これは、正の整数 (0 より大きい) か、または任意の算術条件でnull返される のいずれかです。false

于 2013-10-07T05:03:53.720 に答える
0

によって定義された期間が、特定の行の列@StartDate,@EndDateの値によって定義された期間と重複するかどうかを確認する場合、実行する実際の比較は次のとおりです。StartDate,EndDate

StartDate < @EndDate AND EndDate < @StartDate

(一方が重複するかどうかにかかわらず、一方が終了する正確な時刻に開始するような 2 つの期間を考慮するかどうか<に応じて、 を適切に調整します)<=

ロジックは次のとおりです。次の両方の条件が真の場合、2 つの期間が重複します。

  • ピリオド 1 はピリオド 2 が終了する前に始まります
  • ピリオド 2 はピリオド 1 が終了する前に開始します

その他の注意事項 -

ACOUNT決してそう<0ではないため、ロジックの一部が正しくありません。行が存在するかどうかを判断したいだけの場合は、EXISTS(すでに一度使用しているように)を使用します。条件に一致する行の数COUNTを実際に知る必要がない場合は、 a を強制しないでください。

また、最初のクエリでは考慮されているが、2番目のクエリでは考慮されていないことも少し疑わしいと思いますPlanName。これは正しいですか?

于 2013-10-07T05:58:11.467 に答える
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 は常に正の値またはゼロを返します。したがって、最初の条件は常に false です。

* UPDATE : * 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 に答える