Ü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.