我第一次发帖。
我有一项棘手的任务是在一个范围内查找最新日期,但不包括多个其他日期范围。我有可以工作的代码,但它似乎非常费力。
我在一个范围内选择MAX(Date) 。但是,我有一个表bfShow,其中每个节目都有自己的日期范围(存储为DateStart和DateEnd)。所以我需要在那个日期没有节目的范围内的MAX ( Date)(可能有 0 到 99 个节目与我的日期范围重叠)。
注意:我有dbo.fnSeqDates效果很好(通过 Google 找到)并返回一个范围内的所有日期 - 可以非常快速地填写 6/1/12、6/2/12、6/3/12...6 /30/12 等
我正在做的(如下)是创建一个包含所有日期(范围内)的表格,然后找到该范围内的所有节目(#ShowIDs)并遍历这些节目,一次一个,删除所有这些日期(来自#DateRange)。最终,#DateRange 只剩下“空”日期。因此,#DateRange 中剩余的 MAX(Date) 是我本月最后一个没有演出的日期。
同样,我下面的代码确实有效,但必须有更好的方法。想法?
谢谢你,托德
创建过程 spLastEmptyDate
@DateStart 日期
, @DateEnd 日期
作为
开始
-- 变量...
声明@ShowID int
声明@EmptyDate 日期
-- 临时表...
创建表 #DateRange(dDate 日期)
创建表 #ShowIDs(ShowID int)
-- 加载范围内的所有日期(本月-ISH)...
插入#DateRange(dDate)
选择 SeqDate
来自 dbo.fnSeqDates(@DateStart, @DateEnd)
-- 加载范围内的所有节目 ID(本月)...
插入#ShowIDs(ShowID)
选择 s.ShowID
来自 bfShow 的
其中 s.DateStart = @DateStart
-- PRIME SHOW ID...
设置@ShowID = 0
选择@ShowID = min(ShowID)
来自#ShowIDs
-- 全部运行,删除日期...
而(@ShowID > 0)
开始
-- 从温度中移除...
删除 DR
来自#DateRange DR
, bfShow s
其中 s.DateStart 和 s.DateEnd 之间的 DR.dDate
和 s.ShowID = @ShowID
-- 从 TEMP 中删除那个...
从#ShowIDs 中删除
其中 ShowID = @ShowID
-- 获取下一个 ID...
设置@ShowID = 0
选择@ShowID = min(ShowID)
来自#ShowIDs
结尾
-- 获取最后一个空位...
选择@EmptyDate = max(dDate)
来自#DateRange
- 清理...
删除表#DateRange
删除表 #ShowIDs
-- 返回数据...
选择 @EmptyDate 作为 LastEmptyDateInRange
结尾