到目前为止,我有一张换班时间表,如下所示
id | shift_id | start | finish
1 | 1 | 2017-11-20 | 2017-11-24
2 | 2 | 2017-11-20 | 2017-11-24
3 | 1 | 2017-11-27 | 2017-12-01
4 | 2 | 2017-11-27 | 2017-12-01
5 | 1 | 2017-12-04 | 2017-12-08
6 | 6 | 2017-12-04 | 2017-12-08
我想通过一个日期或使用日期范围搜索数据库,并且已使用以下方法: -
// Query shift data
$sql = "SELECT * FROM " . SCHEDULE_TABLE . "
INNER JOIN " . SHIFTS_TABLE . " ON " . SCHEDULE_TABLE . ".shift_id = " . SHIFTS_TABLE . ".shift_id
WHERE :startDate >= start AND start < :endDate";
$stmt = $pdo->prepare($sql);
$stmt->execute(['startDate' => $startDate, 'endDate' => $endDate]);
所以,如果我将$ startdate设置为&#34; 2017-11-21&#34;和$ endDate到&#34; 2017-11-21&#34;我希望查询返回id为1和2的结果(它确实如此)
但是,如果我搜索超出给定周的范围,我只会获得1周的结果,例如,如果我将$ startDate设置为&#34; 2017-11-22&#34;并结束日期&#34; 2017-12-06&#34;我希望查询返回所有6行,但它返回前2行。
我知道这可能是我查询的一个问题,因为我只搜索起始列而从不使用完成列。
最终当返回查询时,我会将日期范围内的每个班次放入一个数组中,这样如果我搜索&#34; 2017-11-20&#34; - &#34; 2017-11-24&#34;我最终得到一个数组: -
{
date: 2017-11-20
shift: 1
date: 2017-11-20
shift: 2
date: 2017-11-21
shift: 1
date: 2017-11-21
shift: 2
etc...
}
我应该修复我的SQL查询,还是应该重新构建表格,以便每天存储而不是5天块?
答案 0 :(得分:0)
这看起来像是重叠范围问题。在WHERE
子句中尝试这个逻辑:
WHERE :startDate < finish AND :endDate > start
以下是一个针对以下查询的演示,该演示显示所有六条记录都会在您提到的日期范围内返回。
SELECT *
FROM yourTable
WHERE '2017-11-22' < finish AND '2017-12-06' > start;