|
|
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Я уже сломал себе голову, как делать выборку из базы, соответствующую моим пожеланиям. Как вычислять пересечения на линейных отрезках времени, я знаю давно и делаю это без проблем. Описанные же ниже временные интервалы положены не на прямую линию, а замкнутую. Ну, довольно лирики, теперь к делу. Суть: у пользователей сайта есть "прайм-тайм" - это свободное время которое они могут уделить определенным действиям. Прайм-тайм - это ежедневное событие, которое имеет время начала и в время окончания. Имеется таблица вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Делаем запрос (привел псевдокод, дабы сделать упор на логику, а не на синтаксис): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. И все бы было блеск, если бы не одно "но". И этим "но" является пересечение "нулевой" отметки суток. Допустим, что в той же таблице есть другой пользователь: Код: plaintext 1. 2. 3. 4. 5. И тогда при выборке между 20 и 02, выражение Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. не вернёт ни одного результата. Вот такая у меня задачка, как будто из учебника, казалось бы - а я уже сутки голову ломаю. Помогите решить сей вопрос... или хоть подскажите куда копать. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 03:18 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
alter table yourTable add constraint check start<=end and start<=24 and end<=48 чем сводим задачу к предыдущей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 03:50 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
SERG1257, Ваша многословность меня поражает! =) Ну создали мы ограничитель, а дальше-то что? Ведь Проблема не в том, что я ввожу в таблицу (у меня для этого валидаторы, еще до обращения к базе, как рабы трудятся). Или же Вы намекаете на введение "сегодня-завтра"? Это, я так понимаю, 48 часов и есть... Я уже думал об этом, но тогда появляется проблема с теми, чей прайм-тайм начинается допустим с 01 и заканчивается в 03, ведь их прайм-тайм никак не пересечется с праймом того, кто начал 22 а закончил в 26... Нет это не решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 04:16 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
А если "22 | 04" преобразовать в две записи "0 - 04" и "22-24" для одного и того же user? валидаторы start<=end и не более 24 оставить. Да и ваш искательный интервал тоже имеет право переходить через ноль. То бишь в вашем примере не 15-16, а 23-01. В таком случае это будет объединение пересечений 23-24 и 0-01. Гриб третьем - пользователи перекрывающие интервал.А что будет с теми у кого start и end лежат в вашем интервале, то бишь для 15-16 это будет 15:15 - 15:45? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 04:58 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
SERG1257, А вот это уже похоже на правду! У меня и самого такая мысль мелькала, но что-то я ее не "додумал", и отвлёкся. Единственное, что пока не понятно - это рубить ли пополам запрашиваемый интервал, или рубить пополам сохраняемый интервал? Или и то и другое... Что касается интервалов, лежащих "внутри" заданного, то они вполне удовлетворяют и первому, и второму условиям. Ладно, пойду копать. Спасибо огромное! P.S. Если еще какие-то мысли появятся - пишите, я буду мониторить пост. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 05:17 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
авторЧто касается интервалов, лежащих "внутри" заданного, то они вполне удовлетворяют и первому, и второму условиям.Вряд ли. У меня было четыре условия на пересечение интервалов или два условия на непересечение. два писать легче чем четыре поэтому приведу пример. имеем переменные @dstart @dend поля start end дополнительные условия @dstart <=@dend and start<=end интервалы точно не пересекаются если @dend<=start или end<=@dstart ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 05:56 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Вы совершенно правы! Я просто не так понял. Да, ведь я напрочь забыл о случае "вхождения". Так и выходит: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Но у меня изначально @dend вполне мог быть меньше @dstart. Теперь с разбиением на части буду пользоваться "непересечением". И снова спасибо! Искал решение этого вопроса по всему рунету, и даже на буржуйский SO заглянул. Ни где такая тема не обсуждалась (пересечение линейных интервалов - сколько угодно, а вот таких "проблем-2000" не обсуждалось) Уже не надеялся ни на что, когда пост публиковал... в общем, я очень доволен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 06:56 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Гриб, Назовем s - время начала искомого интервала и e - время конца, start, end - соответственно поля в БД 1. Если s <= e, и start <= end, то надо проверять start <= e and end >= s 2. Если s <= e, и start > end то приходим к той же задаче но для интервалов (0..end, start..23:59) 3. Если s > e то применяем предыдущие два пункта для интервалов (0..e, s..23:59) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 12:55 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
F#, Посидев пару часов с листком бумаги и карандашом, и вспомнив школьный курс математики , нашел более изящное решение, без создания дополнительных полей. Пришлось полностью абстрагироваться от понятия времени, и сосредоточится на "окружности"(сутки) и её "дугах"(интервалах). Еще не опробовал на практике, но в теории - всё блеск. Итак: переменные: @start и @end, названия полей `start` и `end`, таблица `table`. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Только вот, как передать из пхп в мускл числа? Он их столбцами не обзовет? Что скажете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 20:06 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Опробовал. Понял ошибку... варианты 1,2 и 3 нужно разбивать на отдельные. С доп. условиями. Сейча пошаманю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 20:12 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Пошаманил! Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Цветёт и пахнет! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 20:51 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Тысяча чертей! Я опять облажался... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 20:55 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Финал! Я вас всех люблю! Это победа! Все протестил, все работает блестяще! А главное изящно (без лишних полей). А вот и финальная версия рабочего запроса... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Всем огромное спасибо за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2014, 21:34 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
Гриб, Я не вводил новых полей, а обозначил s и е параметры (то, что у вас @start и @end) Код: sql 1. 2. можно записать проще Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 09:17 |
|
||
|
Пресечение суточных(!) временных интревалов.
|
|||
|---|---|---|---|
|
#18+
F#, set @start := X; set @end := Y; SELECT * FROM `tab` WHERE GREATEST(`start`, @start) < LEAST(`end`, @end) OR ((`end` > @start OR @end > start) AND SIGN(`end` - `start` ) != SIGN(@end - @start)) OR (`end` < `start` AND @end < @start); Пораскрывал скобки, ну и вообще подшаманил. Самый, как мне кажется, читаемый вариант (на данный момент) вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 13:50 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38526225&tid=1541013]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 496ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...