Deonisius
@Deonisius
Родился в 11110110111 году, 11000 января.

Как выбрать записи за сутки с 10:00 до 10:00?

Приветствую, господа!
Появилась задачка, которую я в php могу решить буквально двумя строками, но стало интересно организовать всё это дело в SQL-запросе.
Предположим, что смена сотрудника длится сутки, с 10:00 до 10:00. Задача: выбрать записи за текущую смену. То есть, если сейчас >= 10 часов, то выбрать с 10:00 текущего дня до 10:00 завтрашнего. И если сейчас < 10 часов, то с 10:00 вчерашнего дня до 10:00 текущего. Пока дошел до такого решения, которое не особо мне нравится:
SELECT * FROM `some_table`
    WHERE
      `datetime_field`
    BETWEEN
     
    CASE
    WHEN
      HOUR( NOW( ) ) >= 10
    THEN
      DATE_FORMAT(CURDATE(), '%Y-%m-%d 10:00')
    ELSE
      DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -1 DAY), '%Y-%m-%d 10:00')
    END
     
    AND
     
    CASE
    WHEN
      HOUR( NOW( ) ) >= 10
    THEN
      DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 1 DAY), '%Y-%m-%d 10:00')
    ELSE
      DATE_FORMAT(CURDATE(), '%Y-%m-%d 10:00')
    END
Вопрос, собственно, заключается в том, как можно (если можно) оптимизировать данный запрос?
  • Вопрос задан
  • 361 просмотр
Пригласить эксперта
Ответы на вопрос 2
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Все это константы:
HOUR( NOW( ) )
DATE_FORMAT(CURDATE(), '%Y-%m-%d 10:00')
DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL -1 DAY), '%Y-%m-%d 10:00')

Предрасчитайте их в программе, и передавайте параметрами в запрос. В итоге у вас получится простой запрос с WHERE по BETWEEN двух дат.
Ответ написан
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Если хотите скорости то откажитесь от функций в условиях таких как Now CUR* других преоброзований форматов/форматирования.

Генерируйте на ЯП нужные 2 даты и подставляйте в запрос в зависимости от часа.
SELECT * FROM `some_table` 
WHERE `datetime_field` BETWEEN '2015-07-22 10:00' AND '2015-07-21 10:00'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы