2013-10-07 92 views
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 [email protected]) 
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,如果記錄不存在,則應該插入詳細信息。日期範圍日期之間不存在

I無法實現此邏輯我錯了,請告訴我任何解決方案。

編輯:首先Consulton檢查planName是否存在或不存在,如果不存在則想檢查開始和結束日期是否已存在或不存在(包括開始和結束) 我嘗試了兩種方式,如回覆中所述。

例如:如果現有開始和結束範圍是開始2013-10-09,結束2013-10-15,如果要插入另一個計劃,則該計劃的開始和結束日期不應該在9日十月十五日和開始日期和結束日期不應該是第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>[email protected] AND 

EndDate<[email protected])=0) 

RESULT: It insert the date with out Considering the above condition. 
+0

'開始日期<= @StartDate日期和結束日期<= @ EndDate'檢查這些條件不應該是像'起始日期> = @StartDate日期和結束日期<= @ EndDate' – 2013-10-07 05:04:37

回答

0

COUNT(*)可以永遠小於零喜歡你的代碼提示。 它是一個正整數(大於零)或null,在任何算術條件下它都會返回false

1

我認爲你需要改變你的,如果從

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

+0

如果想不僅在什麼範圍內包括開始和結束日期? – kida

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 [email protected]) 
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 

由於計數總是返回正值或零。所以你的第一個條件總是假的。

* UPDATE * 你想說的話,如果SDATE是'12 -12-2013' 和EDATE是'15 -12-2013' ,那麼你不想在檢查,如果認爲這些日期所以後來嘗試用下面替換查詢:

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

感謝您的答覆...如果我插入日期已在現有的範圍內,它不會插入...在這裏我想考慮開始和結束日期...包括開始和結束日期.. – kida

+0

@ kida請審查更新回答 –

+0

嗨拉曼,它不斷插入數據,甚至曲線的開始和結束日期是在已經存在的日期範圍.. – kida

0

如果你想檢查由@StartDate,@EndDate定義的週期是否與該值在StartDate,EndDate列特定行,那麼實際的比較定義的任何時期重疊你想要執行的是:

StartDate < @EndDate AND EndDate < @StartDate 

(帶至<=這取決於你是否要考慮兩個時期,使得一個人開始在準確的時間,其他完成的重疊或不<適當調整)

的邏輯是 - 兩個週期交疊如果同時滿足以下兩個條件都爲真:週期2結束

  • 週期期間1前2點開始之前

    • 期間1點開始結束

    其他注意事項 -

    一個COUNT永遠<0所以邏輯的一部分是不正確。如果您只想確定是否存在任何行,請使用EXISTS(因爲您已經有一次) - 如果您實際上不需要知道,請不要強制COUNT有多少行行符合您的標準。

    我還發現它有點懷疑你的第一個查詢認爲PlanName,但你的第二個查詢沒有。你確定這是正確的嗎?