4

テーブルを含む SQL Server データベースがありtimesheetます。このテーブルは、従業員のロールを格納するために使用されます。挿入を実行する前に、従業員が選択した日に既存の役割を持っていることを確認します。

既存のロールの数を返すストアド プロシージャを次に示します。

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 fk_PersonnelID=@personnelID)

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、挿入が発生します

私は何を間違っていますか?

4

3 に答える 3

1

オーバーラップ テストが正しくありません。テストは、「両方の開始が反対側の終了の前に来る」必要があります。それを覚えておいてください、それは簡単です。

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

存在をテストするには、すべての一致を COUNT する代わりに、短絡して結果が見つかるとすぐに結果を返す EXISTS の使用に切り替えます。

于 2012-10-30T18:25:02.800 に答える
0

コードが想定しているように、一致させようとしていると思われる日付間隔の範囲が重複しており、適切に含まれていないため、日付比較の不等式に論理エラーがあります。

つまり、10/4 - 10/6 は 10/5 - 10/11 と厳密にオーバーラップしますが、コードは、パラメーター間隔がデータ行の間隔内に完全に収まる必要があることを意味します。

于 2012-10-30T18:28:16.840 に答える
0

必要な結果を得るために StartDate 列と EndDate 列を解析する必要はありません。

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 より大きい数値を返します。

于 2012-10-30T18:19:47.850 に答える