关于between and 的一个例子

假设有一列士兵,需要确定哪些士兵可以参加一场战争的某场战斗,现有两张表---一张表列出士兵与他们的服役期,一张列出战争中交战的开始日期和结束日期,然后要返回与交战列表交叉引用的士兵列表,即查出哪些士兵可以参加哪些战争。

战争表

create table #engagements(
 engagement varchar(30),             -------------战争名称
 engagementStart smalldatetime,  -------------战争开始日期
 engagementEnd smalldatetime)   -------------战争结束日期

士兵表

create table #soldier_tours(
 soldier varchar(30),      ------士兵姓名
 tourStart smalldatetime,    ------服役开始时间
 tourEnd smalldatetime)    ----服役结束时间

一种策略是正面找出士兵的服役开始时间在战争开始与结束时间之间或者服役结束时间在战争开始和结束时间之间或者战争开始时间在服役开始时间和结束时间之间。如:

select soldier + 'served during the ' + Engagement

from #sodier_tours,#engagements

where  (tourStart between engagementStart and engagementEnd ) or 

    (tourEnd between engagementStart and engagementEnd ) or

    (engagementStart between tourStart and tourEnd )

一种策略是从反面着手,不是确定两者的重叠时间,而是确定不重叠时间,如果服役期和战斗不是同时发射能改的,那么下面两事件总有一个是正确的,或者服役期在交战开始前结束,或者是在交战结束后开始,这样,就大大简化查询,并删除所有的谓词between。

   select soldier + 'served during the ' + engagement

   from #soldier_tours,#engagements

  where not ((tourEnd < engagementStart ) or (tourStart > engagementEnd))

原文地址:https://www.cnblogs.com/xiangpiaopiao2011/p/2041998.html