2012-10-30 86 views
4

之間我有一個包含timesheet表中的SQL Server數據庫。此表用於存儲員工的角色。在執行插入操作之前,我會檢查員工在選定日期中是否有任何預先存在的角色。過程獲取日期在

這裏有一個存儲過程返回預先存在的角色

set @retVal=(select count(fk_RoleID) from dbo.TimesheetTable where 
(@startdate >= CAST((
STR(YEAR(StartDate)) + '/' + 
STR(MONTH(StartDate)) + '/' + 
STR(DAY(StartDate)) 
) 
AS DATE 
))-- AND EndDate <= '2012-08-30') 
and 
(@enddate < CAST(
(
STR(YEAR(EndDate)) + '/' + 
STR(MONTH(EndDate)) + '/' + 
STR(DAY(EndDate)) 
) 
AS DATE 
)) 
and [email protected]) 

return @retVal 

以下是一個員工記錄的計數..

pk_ID fk_PersonnelID fk_RoleID StartDate EndDate  dateCreated 
62  1    26   2012-10-01 2012-10-02 2012-10-25 15:55:12.940 
81  1    20   2012-10-04 2012-10-06 2012-10-30 14:50:28.300 

如果我嘗試做的地方插入開始日期爲2012-10-05,並且結束日期爲2012-10-11,查詢無法捕獲startdate ..並且插入發生

我做錯了什麼?

回答

0

你不應該需要解析的起始日期和結束日期列,從而獲得所需結果。這裏

SELECT @retVal = COUNT(fk_RoleID) 
FROM dbo.TimesheetTable AS tt 
WHERE @startDate <= tt.EndDate 
    AND @endDate >= tt.StartDate 
    AND fk_PersonnelId = @personnelID; 

return @retVal; 

@retVal會返回一個大於0的數字爲已經在數據庫中的調度輸入。

+1

其實YYYY-MM-DD是不是安全無論是。嘗試使用SET LANGUAGE FRENCH。無論如何,你的代碼是正確的,沒有理由將它們解析爲字符串,但是你可能需要消除時間。 –

+0

@AaronBertrand你是對的。我應該爲美國安裝指定默認值。我會刪除那部分。 –

1

您重疊測試是不正確。 該測試應該是「兩端都開始出現在相反兩端」之前。記住它,這很容易。

SELECT @retVal = CASE WHEN EXISTS (
    select * 
    from dbo.TimesheetTable 
    where StartDate <= @EndDate 
     and @StartDate <= EndDate 
     and [email protected]) THEN 1 ELSE 0 END 

要測試存在,切換到使用EXISTS這將短路,結果發現,而不是計算所有的比賽,儘快給你一個結果。

0

你有一個邏輯上的錯誤在你的日期比較不平等,因爲日期間隔的範圍,我認爲你試圖匹配是重疊的 - 沒有正確載 - 爲您的代碼似乎承擔。

即10/4 - 10/6與10/5 - 10/11嚴格重疊,而您的代碼暗示參數間隔必須完全位於數據行 s間隔內。

+0

似乎你是正確的,但這就是如何定義業務邏輯。關於如何捕獲任何日期重疊和何時不重合的想法? – Napstar

+0

@ user1013666任何重疊的邏輯是,開始1必須是上或端部2之前,開始2必須上或端1.有此限制是有一些重疊(用適當遏制電位)之前。如果你必須說服自己的邏輯,請畫出自己的圖表。它也對稱於區間,因爲解決方案的這個屬性也應該是不言而喻的。 –