यहां दिनांक सीमा को इस तरह समतल करने का एक तरीका दिया गया है
Start | End
2009-1-1 06:00 | 2009-1-1 18:00
2009-2-1 20:00 | 2009-2-2 04:00
2009-2-2 06:00 | 2009-2-2 14:00
आपको पिछली की तुलना करनी होगी और अगला प्रत्येक पंक्ति में दिनांक और देखें कि क्या
- वर्तमान पंक्ति की प्रारंभ दिनांक पिछली पंक्ति की दिनांक सीमा के बीच आता है.
- वर्तमान पंक्ति की समाप्त तारीख अगली पंक्ति की तारीख सीमा के बीच आती है।
उपरोक्त कोड का उपयोग करना, UDF को लागू करना उतना ही सरल है जितना कि अनुसरण किया गया।
create function fnThereIsWatchmenBetween(@from datetime, @to datetime)
returns bit
as
begin
declare @_Result bit
declare @FlattenedDateRange table (
Start datetime,
[End] datetime
)
insert @FlattenedDateRange(Start, [End])
select distinct
Start =
case
when Pv.Start is null then Curr.Start
when Curr.Start between Pv.Start and Pv.[End] then Pv.Start
else Curr.Start
end,
[End] =
case
when Curr.[End] between Nx.Start and Nx.[End] then Nx.[End]
else Curr.[End]
end
from shift Curr
left join shift Pv on Pv.ID = Curr.ID - 1 --; prev
left join shift Nx on Nx.ID = Curr.ID + 1 --; next
if exists( select 1
from FlattenedDateRange R
where @from between R.Start and R.[End]
and @to between R.Start and R.[End]) begin
set @_Result = 1 --; There is/are watchman/men during specified date range
end
else begin
set @_Result = 0 --; There is NO watchman
end
return @_Result
end