Restrição de verificação de sobreposição no intervalo de datas
Eu tenho uma tabela simples no sql server 2005 com 3 colunas: DateStart, DateEnd e Value. Eu tentei definir uma "restrição de verificação de tabela" para evitar a inserção de registros sobrepostos. Por exemplo, se nessa tabela houver um registro com DateStart = 2012-01-01 (primeiro janeiro) e DateEnd 2012-01-15 (15 de janeiro), a restrição Check deve evitar a inserção de um registro com DateStart = 2012-01-10 ( no care DateEnd), um registro com DateEnd = 2012-01-10 (sem tratamento DateStart) ou um registro com DateStart 2011-12-10 e DateEnd 2012-02-01.
Eu defini um UDF de tal maneira:
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
Então pensei que cheque poderia ser isso:
ALTER TABLE [dbo].[myTable] WITH CHECK ADD CONSTRAINT [CK_OverlappingDateRange] CHECK ([dbo].[ufn_checkOverlappingDateRange]([DateStart],[DateEnd])<>(0))
Mas mesmo com [myTable] vazio, o operador EXISTS retorna true quando eu insiro o primeiro registro. Onde eu estou wrog? É possível definir uma restrição como essa?
BTW eu considero DateStart inclui no intervalo e DateEnd exclui do intervalo.