属于包

时间:2015-06-21 20:33:38

标签: sql sql-server date datediff items

我目前正在开发一个有3个表的数据库:

Bottles(**BottleCode**, Dsc, Capacity, BottleDate)

BottleDate列是瓶子装满的日期。

Pack(**PackCode**, PackType, PackDate)

PackDate列是创建包的日期。

Pack-Bottle(**BottleCode**, **PackCode**)

我想要做的是从任何瓶子之间相隔30天或更长时间的包装中获取PackCode(BottleDate)

我试图在SQL Server中使用DATEDIFF()解决此问题,但我不知道如何从包中获取最旧和最近的日期,以便我可以检查它们之间的差异是否结束30。

我真的输了,如果有人至少能指出我正确的方向,我真的很感激。

提前致谢:)

场景:

我们说我有一个包含代码" abc123"其中包含两瓶其中一瓶已装满" 2014/05/23"另一个填写在" 2014/09/17",结果应该是" ABC123"因为它包含两个彼此间隔30天或更长时间的瓶子,请注意一个包装的瓶子不止两瓶。

现在让我说我有另一个包含代码" efg456"有三瓶装满了#34; 2012/05/04"," 2012/05/15#34;和#34; 2012/05/28 /包装代码" efg456"结果不应该出现,因为它的所有瓶子都在相隔30天的时间内被填充

1 个答案:

答案 0 :(得分:1)

以下是使用exists子句的一种方法:

select p.*
from packs p
where exists (select 1
              from packbottle pb join
                   bottle b
                   on pb.bottlecode = b.bottlecode
              where pb.packcode = p.packcode and
                    b.bottledate < dateadd(day, -30, p.packdate)
             );

因为您只想要而不是 bottle exists似乎是合适的解决方案。

编辑:

如果您想在任何瓶子上使用它,那么您根本不需要packs表。实际上,查询只是一个带有having子句的简单聚合查询:

select pb.packcode, min(bottledate), max(bottledate)
from packbottle pb join
     bottle b
     on pb.bottlecode = p.bottlecode
group by pb.packcode
having datedif(day, min(bottledate), max(bottledate)) > 30