Opened 8 years ago

Closed 8 years ago

Last modified 7 years ago

#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 dimag, 8 years ago

Keywords: SQL query audio added

Запрос фильтрации должен возвращать в том числе все конференции которые начались до заданного промежутка времени и закончились в нём, и начались в заданный промежуток времени и завершились вне его, как и записи которые перекрывают заданный промежуток времени. Поэтому у меня такой запрос.

comment:2 by san, 8 years ago

Алексей, тебя устраивает Димин ответ?

in reply to:  2 comment:3 by alx, 8 years ago

Replying to san:

Алексей, тебя устраивает Димин ответ?

А на какой вопрос он отвечал?

Если на вопрос ticket:251#comment:6, то не устраивает. Например, предложенное мной условие также удовлетворяет изложенным выше требованиям к тому, что должен возвращать запрос, при этом оно в 4 раза проще - в нем один оператор AND вместо четырех операторов BETWEEN (что BETWEEN - это две операции сравнения, я не учитываю), соединенных, в свою очередь, операторами AND и OR. Сам хотя бы чисто визуально сравни два выражения, приведенные в описании тикета, и представь, что кто-то читает текст программы чтобы понять, что здесь запрашивают... Нет, тема "зачем так сложно" не раскрыта...

Last edited 8 years ago by alx (previous) (diff)

comment:4 by dimag, 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

in reply to:  4 comment:5 by alx, 8 years ago

Replying to dimag:

Можно попробовать заменить запрос на следующий:

Безусловно, попробовать можно все что угодно. Непонятна цель такой пробы. :)

comment:6 by san, 8 years ago

Проверил вариант предложеный Алексеем.
Вот таблица возможных вариантов:

  1. S E s e
  2. S s E e
  3. S s e E
  4. s S E e
  5. s S e E
  6. 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 - ЛОЖЬ, что соответствует логике поиска.

comment:7 by dimag, 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')
и заменить им текущее использованное.

in reply to:  7 comment:8 by alx, 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:9 by san, 8 years ago

Да, я согласен с аргументами Алексея изложенными в тексте тикета :)

comment:10 by dimag, 8 years ago

Resolution: fixed
Status: newclosed

r364
Используем предлагаемый запрос.

comment:11 by san, 7 years ago

Milestone: Текущее2 очередь

Milestone renamed

Note: See TracTickets for help on using tickets.