Select 根据工作日和 MySql 中的特定时间记录
Select records based on week day and specific time in MySql
我需要根据特定条件过滤掉特定事件,例如
- [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]]
)
最终数组可能会根据需要进行调整,但是现在我想 select 来自 schedule_event
table 其中有 starts_at
属性 存储日期时间。
问题是,是否可以 select 特定事件,例如星期一将 return 开始于 12:00 的人(星期二不应该),星期五将 return 17:15 和 18:00.
到目前为止我有这个:
... WEEKDAY(se.startsAt) IN (:weekDays) ...
而 :weekDays
只是给定数组的 array_keys
。
现在,我不知道如何实际包括时间。
您必须创建成对的工作日 - 小时 [- 分钟] 条件才能达到预期结果:
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()
调用,但我会把它留给你。
您不能再使用 WEEKDAY IN (list of days)
,因为仅工作日不足以得出真相。您需要一个 OR 列表,每个 OR 由一个工作日条件和当天的小时条件组成,这是一个列表,最后一个将被 OR 在一起。
所以你 assemble 将数组放入 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
。
我需要根据特定条件过滤掉特定事件,例如
- [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]]
)
最终数组可能会根据需要进行调整,但是现在我想 select 来自 schedule_event
table 其中有 starts_at
属性 存储日期时间。
问题是,是否可以 select 特定事件,例如星期一将 return 开始于 12:00 的人(星期二不应该),星期五将 return 17:15 和 18:00.
到目前为止我有这个:
... WEEKDAY(se.startsAt) IN (:weekDays) ...
而 :weekDays
只是给定数组的 array_keys
。
现在,我不知道如何实际包括时间。
您必须创建成对的工作日 - 小时 [- 分钟] 条件才能达到预期结果:
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()
调用,但我会把它留给你。
您不能再使用 WEEKDAY IN (list of days)
,因为仅工作日不足以得出真相。您需要一个 OR 列表,每个 OR 由一个工作日条件和当天的小时条件组成,这是一个列表,最后一个将被 OR 在一起。
所以你 assemble 将数组放入 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
。