|
Снова пересекающиеся диапазоны, просьба проверить
|
|||
---|---|---|---|
#18+
У меня глаз замылился, просьба посмотреть, не упустил ли чего. Суть задачи — нужно начислить компенсацию за перебои в оказании сервисов. Компенсации подлежат только те услуги, которые на период перебоев были оплачены. Если услуга была активно только часть этого периода, то и компенсации подлежит только часть периода. Таблица услуг и статуса услуг: SERVICE_IDSERVICE_FEE_DAILY110021003500 SERVICE_IDDATE_BEGDATE_ENDSTATUS12010-01-012010-03-01112010-03-012010-03-10012010-03-10122010-01-202010-02-01122010-02-01032010-01-052010-01-20132010-01-202010-02-01032010-02-012010-03-01132010-03-012010-03-15032010-03-151 Таблица перерывов в оказании сервисов (дата и длительность в днях): ACCIDENT_IDACCIDENT_DATEACCIDENT_DURATION12010-01-10122010-01-151032010-02-01542010-02-2510 Запрос я составил такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39.
Вроде бы правильно, но как-то слишком просто. Я ничего не упустил? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2014, 15:59 |
|
Снова пересекающиеся диапазоны, просьба проверить
|
|||
---|---|---|---|
#18+
Небольшая поправка для учета пересечения: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2014, 16:23 |
|
Снова пересекающиеся диапазоны, просьба проверить
|
|||
---|---|---|---|
#18+
Не хочется создавать очередную тему по интервалам, но хочется уточнить, что я не ошибаюсь. Допустим, есть набор различных периодов a-b. Нужно выбрать из них те, которые полностью или частично пересекают заданный период A-B (1, 6, 7, 8). То есть a-b может быть полностью внутри периода, может быть частично или полностью за его пределами. Использовать greatest(a,A)>=A и least(b,B)<B внутри соединения join я не хочу, потому что перестанут работать индексы. Самым простым и эффективным будет соединение not (b <= A or a >= B) ? Или можно обойтись без not и or ? Не знаю, как в Oracle, но в MSSQL мне в свое время советовали всеми силами избегать OR. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:42 |
|
Снова пересекающиеся диапазоны, просьба проверить
|
|||
---|---|---|---|
#18+
Alibek B. not (b <= A or a >= B) 1. not (b <= A or a >= B) === b > A and a < B 2. Вопросы эффективности с т.з. БД формулируются и решаются иначе. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2021, 18:47 |
|
|
start [/forum/topic.php?fid=52&tid=1880158]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
144ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 253ms |
total: | 510ms |
0 / 0 |