2015-06-21 4 views
0

я в настоящее время работаю над базой данных, которая имеет 3 таблицы:разница между днем ​​для товаров, которые относятся к упаковке

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

Колонок BottleDate является датой, когда бутылка была заполнена.

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

Столбец PackDate - это дата создания пакета.

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

То, что я хочу сделать, это получить PackCode из пакетов, которые имеют разницу в 30 или более дней между любыми из их бутылок (BottleDate)


Я пытался решить это с помощью DATEDIFF() в SQL Server, но я не знаю, как получить самую старую и более свежую дату из пакета, чтобы я мог проверить, превышает ли разница между ними. 30.

Я действительно потерян и Я был бы очень признателен, если бы кто-то мог по крайней мере указать мне в правильном направлении.

Заранее спасибо :)

Сценарий:

Скажем, у меня есть пакет с кодом «abc123», который содержит две бутылки один из них был заполнен на «2014/05/23» и другой был заполнен «2014/09/17», результатом должен быть «abc123», так как он содержит две бутылки, которые были заполнены на расстоянии 30 и более дней друг от друга, обратите внимание, что в упаковке имеется не более двух бутылок.

Теперь можно сказать, что у меня есть еще один пакет с кодом «efg456», который имеет три бутылки, которые были заполнены «2012/05/04», «2012/05/15» и «2012/05/28/соответственно», пакет код «efg456» не должно появиться в результате, так как все это бутылки были заполнены в течение 30 дней друг от друга

+0

Могли бы вы предоставить некоторые выборочные данные и ожидаемый результат? –

+0

Предположим, у меня есть пакет с кодом «abc123», который содержит две бутылки, один из которых был заполнен «2014/05/23», а другой был заполнен «2014/09/17», результат должен быть « abc123 ", так как он содержит две бутылки, которые были заполнены на расстоянии 30 и более дней друг от друга, обратите внимание, что в упаковке есть не более двух бутылок, спасибо и извините за мой плохой английский –

+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) 
      ); 

Потому что вы хотите упаковки только и не бутылки, a exists кажется как соответствующее решение.

EDIT:

Если вы хотите, на любой паре бутылок, то вам не нужно 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 
+0

Извините, я не думаю, что я очень хорошо объяснил ситуацию, мне нужно получить код Pack из Packs, который содержит бутылки, заполненные разницей в 30 и более дней. Мне нужно проверить, что даты из любой бутылки в пакет не 30 дней друг от друга –

Смежные вопросы