我第一次发帖。选择范围内的最大日期,排除其他多个日期范围
我有一个棘手的任务,即查找范围内的最新日期,但不包括多个其他日期范围。我有代码确实工作,但它似乎非常重要。我在MAX(日期)范围内选择。但是,我有一个表格,其中每个节目都有其自己的日期范围(存储为DateStart和DateEnd)。所以我需要MAX(日期)范围内的非在该日期显示(可能有0到99显示重叠我的日期范围)。
注:我有dbo.fnSeqDates伟大的工程(通过谷歌找到),并返回一个范围内的所有日期 - 使得在12年6月1日非常快充,12年6月2日,6/3 /12...6/30/12等
我在做什么(下面)是创建一个表中的所有日期(范围内),然后找到所有在该范围内的显示(# ShowIDs)并遍历这些节目,一次一个,删除所有这些日期(从#DateRange)。最终,#DateRange只剩下“空”日期。因此,剩余在#DateRange中的MAX(日期)是我没有演出的月份中的最后一个日期。
再次,我的代码以下确实工作,但有一个更好的方法。思考?
谢谢 托德
CREATE procedure spLastEmptyDate @DateStart date , @DateEnd date as begin -- VARS... declare @ShowID int declare @EmptyDate date -- TEMP TABLE... create table #DateRange(dDate date) create table #ShowIDs(ShowID int) -- LOAD ALL DATES IN RANGE (THIS MONTH-ISH)... insert into #DateRange(dDate) select SeqDate from dbo.fnSeqDates(@DateStart, @DateEnd) -- LOAD ALL SHOW IDs IN RANGE (THIS MONTH-IS)... insert into #ShowIDs(ShowID) select s.ShowID from bfShow s where s.DateStart = @DateStart -- PRIME SHOW ID... set @ShowID = 0 select @ShowID = min(ShowID) from #ShowIDs -- RUN THRU ALL, REMOVING DATES AS WE GO... while (@ShowID > 0) begin -- REMOVE FROM TEMP... delete DR from #DateRange DR , bfShow s where DR.dDate between s.DateStart and s.DateEnd and s.ShowID = @ShowID -- DROP THAT ONE FROM TEMP... delete from #ShowIDs where ShowID = @ShowID -- GET NEXT ID... set @ShowID = 0 select @ShowID = min(ShowID) from #ShowIDs end -- GET LAST EMPTY SPOT... select @EmptyDate = max(dDate) from #DateRange -- CLEAN UP... drop table #DateRange drop table #ShowIDs -- RETURN DATA... select @EmptyDate as LastEmptyDateInRange end
我认为这是SQL Server 2008或更高版本(给定'date'数据类型)?另外,看起来所有的节目都是在同一天开始的(因为你选择了's.DateStart = @ DateStart') - 那是正确的吗?一些工作示例(S)也将有所帮助... –