【问题标题】:Select records based on week day and specific time in MySql在MySql中根据工作日和特定时间选择记录
【发布时间】:2018-07-21 06:04:14
【问题描述】:

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

  • [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。 现在,我现在不知道如何实际包含时间。

【问题讨论】:

  • 这跟 MySQL 有关系吗?

标签: php mysql weekday


【解决方案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() 呼叫,而不是使用小时和分钟函数,但我将把它留给您。

【讨论】:

    【解决方案2】:

    您不能再使用WEEKDAY IN (list of days),因为仅凭工作日不足以得出真相。您需要一个 OR 列表,每个 OR 由一个工作日条件 AND 与当天的小时条件组成,这是一个列表,最后这些将被 OR'ed 在一起。

    所以你将数组组装成一个 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

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多