@ Пользователь я обновил ответ. Несколько огромных упрощений.
пользуется MSSQL, DB2 или Oracle. Нет CTE. Предикат OVERLAP отсутствует. Нет ИНТЕРВАЛЬНОГО типа данных. Ситуация: на транспортном средстве, подлежащем ремонту, работа не может начаться, пока не будут получены все заказанные для работы детали. Детали можно заказывать несколько раз до начала ремонта. Нам нужно извлечь время, в течение которого автомобиль находился в «состоянии ожидания»
Таким образом, для автомобиля, обозначенного как id = 1, детали были заказаны (d1) и получены (d2) в 4 разных случаях.
ID d1 d2
1 8/1 8/8
1 8/2 8/6
1 8/12 8/14
1 8/3 8/10
8/1 8/8
d1 d2
|-------------------------------|
8/2 8/6 8/12 8/14
d1 d2 d1 d2
|---------------| |----------|
8/3 8/10
d1 d2
|---------------------|
8/1 8/14
|---------------------------------------------------------| = 13 days
8/10 8/12
|--------------------------------------| + |----------| = parts hold = 11 days
Как видно из вышесказанного, время ожидания начала работы (при условии 8/1 в качестве даты, с которой транспортное средство было готово к работе) составляло 13 дней. Фактическое время, потраченное на ожидание деталей, составило 11 дней, и это число, которое нам нужно извлечь из данных. Фактические данные даты и времени будут метками времени, из которых мы будем извлекать часы, мы использовали даты в данных этого примера для простоты представления. Мы пытаемся сгенерировать решение, основанное на множестве (не psm, не udf, не курсор). ТИА