Überlappende Prüfung des Datumsbereichs

Ich habe eine einfache Tabelle in SQL Server 2005 mit 3 Spalten: DateStart, DateEnd und Value. Ich habe versucht, eine "Tabellenprüfungsbeschränkung" festzulegen, um das Einfügen überlappender Datensätze zu vermeiden. Wenn sich beispielsweise in einer solchen Tabelle ein Datensatz mit DateStart = 2012-01-01 (erster Januar) und DateEnd 2012-01-15 (15. Januar) befindet, muss die Check-Einschränkung verhindern, dass ein Datensatz mit DateStart = 2012-01-10 ( egal DateEnd), ein Datensatz mit DateEnd = 2012-01-10 (egal DateStart) oder ein Datensatz mit DateStart 2011-12-10 und DateEnd 2012-02-01.

Ich habe eine UDF folgendermaßen definiert:

CREATE FUNCTION [dbo].[ufn_checkOverlappingDateRange]
(
    @DateStart AS DATETIME
    ,@DateEnd AS DATETIME
)
RETURNS BIT 
AS
BEGIN
  DECLARE @retval BIT
  /* date range at least one day */
  IF (DATEDIFF(day,@DateStart,@DateEnd) < 1)
    BEGIN
      SET @retval=0
    END
  ELSE
    BEGIN
      IF EXISTS
        (
          SELECT
              *
            FROM [dbo].[myTable]
            WHERE
            ((DateStart <= @DateStart) AND (DateEnd > @DateStart))
            OR
            ((@DateStart <= DateStart) AND (@DateEnd > DateStart))
        )
        BEGIN
          SET @retval=0
        END
    ELSE
      BEGIN
            SET @retval=1
          END
        END
  RETURN @retval
END

Dann könnte Gedankenkontrolle folgendes sein:

ALTER TABLE [dbo].[myTable]  WITH CHECK ADD  CONSTRAINT [CK_OverlappingDateRange] CHECK  ([dbo].[ufn_checkOverlappingDateRange]([DateStart],[DateEnd])<>(0))

Aber auch wenn [myTable] leer ist, gibt EXISTS Operator true zurück, wenn ich den ersten Datensatz einfüge. Wo bin ich Wrog? Ist es möglich, eine solche Einschränkung festzulegen?

Übrigens denke ich, dass DateStart in den Bereich einschließt und DateEnd aus dem Bereich ausschließt.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage