#312 closed улучшение (fixed)
Упростить условие поиска записей конференций
Reported by: | alx | Owned by: | dimag |
---|---|---|---|
Priority: | major | Milestone: | 2 очередь |
Component: | ПО MC04-Dispatcher. Пульт диспетчера/техника | Keywords: | SQL query, audio |
Cc: | san |
Description
Сейчас при поиске записей конференций в таблице базы данных используется очень сложное и очень странное выражение:
WHERE (starttime) BETWEEN STR_TO_DATE('2016.08.22 01:30:00', '%Y.%m.%d %H:%i:%s') AND STR_TO_DATE('2016.08.22 08:37:59', '%Y.%m.%d %H:%i:%s') OR (endtime) BETWEEN STR_TO_DATE('2016.08.22 01:30:00', '%Y.%m.%d %H:%i:%s') AND STR_TO_DATE('2016.08.22 08:37:59', '%Y.%m.%d %H:%i:%s') OR STR_TO_DATE('2016.08.22 01:30:00', '%Y.%m.%d %H:%i:%s') BETWEEN starttime and endtime OR STR_TO_DATE('2016.08.22 08:37:59', '%Y.%m.%d %H:%i:%s') BETWEEN starttime and endtime
На прямой вопрос в ticket:251#comment:6 о причине такого сложного условия ответа не последовало.
Отсутствие ответа я расцениваю как отсутствие разумных причин использования такого условия поиска, поэтому предлагаю использовать более простое, логичное и понятное условие поиска записей:
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s') AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
Это даст, во-первых, лучшее понимание кода программы и логики ее работы, и во-вторых, снизит нагрузку на сервер базы данных, уменьшив объем проверок в процессе SELECT'а.
Change History (11)
comment:1 by , 8 years ago
Keywords: | SQL query audio added |
---|
comment:3 by , 8 years ago
Replying to san:
Алексей, тебя устраивает Димин ответ?
А на какой вопрос он отвечал?
Если на вопрос ticket:251#comment:6, то не устраивает. Например, предложенное мной условие также удовлетворяет изложенным выше требованиям к тому, что должен возвращать запрос, при этом оно в 4 раза проще - в нем один оператор AND вместо четырех операторов BETWEEN (что BETWEEN - это две операции сравнения, я не учитываю), соединенных, в свою очередь, операторами AND и OR. Сам хотя бы чисто визуально сравни два выражения, приведенные в описании тикета, и представь, что кто-то читает текст программы чтобы понять, что здесь запрашивают... Нет, тема "зачем так сложно" не раскрыта...
follow-up: 5 comment:4 by , 8 years ago
Можно попробовать заменить запрос на следующий:
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s')
AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
OR
STR_TO_DATE('2016.08.22 01:30:00', '%Y.%m.%d %H:%i:%s') BETWEEN starttime and endtime OR
STR_TO_DATE('2016.08.22 08:37:59', '%Y.%m.%d %H:%i:%s') BETWEEN starttime and endtime
comment:5 by , 8 years ago
Replying to dimag:
Можно попробовать заменить запрос на следующий:
Безусловно, попробовать можно все что угодно. Непонятна цель такой пробы. :)
comment:6 by , 8 years ago
Проверил вариант предложеный Алексеем.
Вот таблица возможных вариантов:
- S E s e
- S s E e
- S s e E
- s S E e
- s S e E
- s e S E
где время начала и конца конференции (S, E)
и два времени, заданные параметрами фильтра (s, e)
Условие поиска, предложенное Алексеем
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s') AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
можно представить в виде:
(E>=s)AND(S<=e)
Несложно проверить что для вариантов 2,3,4,5 результат будет ИСТИНА, а для 1,6 - ЛОЖЬ, что соответствует логике поиска.
follow-up: 8 comment:7 by , 8 years ago
То есть вы предлагаете использовать следующее условие для запроса:
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s')
AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
и заменить им текущее использованное.
comment:8 by , 8 years ago
Replying to dimag:
То есть вы предлагаете использовать следующее условие для запроса:
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s')
AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
:) Рад, что Вы прочитали описание тикета, где так и написано:
...предлагаю использовать более простое, логичное и понятное условие поиска записей:
WHERE endtime >= STR_TO_DATE('2016.07.26 14:02:00', '%Y.%m.%d %H:%i:%s') AND starttime <= STR_TO_DATE('2016.07.26 14:05:59', '%Y.%m.%d %H:%i:%s')
:) :) :)
comment:10 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
r364
Используем предлагаемый запрос.
Запрос фильтрации должен возвращать в том числе все конференции которые начались до заданного промежутка времени и закончились в нём, и начались в заданный промежуток времени и завершились вне его, как и записи которые перекрывают заданный промежуток времени. Поэтому у меня такой запрос.