时间表的最佳数据库架构

时间:2017-12-08 01:42:19

标签: php mysql database

到目前为止,我有一张换班时间表,如下所示

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天块?

1 个答案:

答案 0 :(得分:0)

这看起来像是重叠范围问题。在WHERE子句中尝试这个逻辑:

WHERE :startDate < finish AND :endDate > start

以下是一个针对以下查询的演示,该演示显示所有六条记录都会在您提到的日期范围内返回。

SELECT *
FROM yourTable
WHERE '2017-11-22' < finish AND '2017-12-06' > start;    

Demo