Выберите записи на основе дня недели и конкретного времени в MySql

Мне нужно отфильтровать конкретные события на основе определенных критериев, например,

  • [х] Мо
    • [х] 12:00
    • [] 14:00
  • [х] вт
    • [] 12:00
    • [x] 15:30
  • [х] пт
    • [] 10:00
    • [] 11:30
    • [x] 17:15
    • [x] 18:00

который дает следующий массив в php:

array(
0 => [[12, 00]],
1 => [[15, 30]],
4 => [[17, 15], [18, 00]]
)

Окончательный массив может быть скорректирован в соответствии с потребностями, однако теперь я хочу выбрать из schedule_event стол, который имеет starts_at свойство, которое хранит дату и время

Вопрос в том, можно ли выбрать конкретные события, например, Понедельник вернет тех, кто начинается в 12:00 (вторник не должен), пятница вернется в 17:15 и 18:00.

До сих пор у меня было это:

... WEEKDAY(se.startsAt) IN (:weekDays) ...

А также :weekDays было просто array_keys данного массива.
Теперь я не знаю, как на самом деле включить время сейчас.

-1

Решение

Вы должны создать пары условий будний день — час [- минута] для достижения ожидаемого результата:

select ...
from ...
where WEEKDAY(se.startsAt)=0 and hour(se.startsAt)=12
or WEEKDAY(se.startsAt)=1 and hour(se.startsAt)=15 and minute(se.startsAt)=30
...

Вместо использования часов и минут, вы также можете использовать один date_format() позвони, но я оставлю это тебе.

1

Другие решения

Вы больше не можете использовать WEEKDAY IN (list of days) потому что одного дня недели недостаточно, чтобы дать истину. Вам нужен список ИЛИ, и каждое ИЛИ состоит из условия дня недели И с часовыми условиями для этого дня, которые являются списком, и эти последние будут объединены ИЛИ.

Таким образом, вы собираете массив в SQL-запрос, где вам нужно построить как SQL, так и значения:

array(
0 => [[12, 00]],
1 => [[15, 30]],
4 => [[17, 15], [18, 00]]
)$sets   = [ ]; // SQL conditions for each day
$values = [ ]; // List of accumulated values to send to execution

foreach ($conditions as $dayNum => $listTimes) {
$hours = [ ];
$values[] = (int)$dayNum;

// Each time is an array of (hour, minute)
// which comes handy for building the query
foreach ($listTimes as $pair) {
$hours[] = '(HOUR(se.startsAt) = ? AND MINUTE(se.startsAt) = ?)';
$values[] = (int)$pair[0];
$values[] = (int)$pair[1];
}
$sets[] = "(WEEKDAY(se.startsAt)=? AND (" . implode(' OR ', $hours) . "))";
}

$filter = implode(' OR ', $sets);

Это станет чем-то вроде (пропуская аргументы для ясности)

(WEEKDAY=0 AND ((HOUR=12 AND MINUTE=0)))
OR
(WEEKDAY=1 AND ((HOUR=12 AND MINUTE=0) OR (HOUR=14 AND MINUTE=30)))
...

Так:

// PREPARE this
$sql = "SELECT ... WHERE {$assembledConditions}";
// And EXECUTE passing $values.

Любые дополнительные значения в запросе должны быть помещены в $values заранее, конечно.

1

По вопросам рекламы [email protected]