在MySql中根据工作日和特定时间选择记录

时间:2018-02-10 16:58:26

标签: php mysql weekday

我需要根据特定标准过滤掉特定事件,例如

  • [x]莫
    • [x] 12:00
    • [] 14:00
  • [x]星期二
    • [] 12:00
    • [x] 15:30
  • [x]周五
    • [] 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。 现在,我不知道现在如何实际包括时间。

2 个答案:

答案 0 :(得分: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 :(得分:1)

你不能再使用WEEKDAY IN (list of days),因为仅靠工作日不足以产生真相。您需要一个OR列表,每个OR由工作日条件和当天的小时条件组成,这是一个列表,这些最后一个将被“或”在一起。

因此,您将数组组装成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中。