我正在建立一个基本系统,随机选择2名员工,以支持半天的业务。我真的在努力使用数据库,以及我如何实际完成这项任务,因为他们已经列出了某些使它非常棘手的规则。
商业规则:
我是一个真正的初学者,但到目前为止,这就是我对这个问题的看法:
两个表:
雇员:
employee_id (pk)
first_name
last_name
转移:
shift_id (pk)
employee_id (fk)
shift_hours
样本数据:
1. shift_id = 1, employee_id = 1, shift_hours = 4
2. shift_id = 2, employee_id = 2, shift_hours = 6
1. employee_id = 1, first_name = steve, second_name = jones
2. employee_id = 2, first_name = rob, second_name = helen
我的问题如下:基于上面的数据,我可以查询什么以确保我只从数据库中挑选过去14天内工作时间不超过8小时的用户(我怎么能解决这14天的问题,有人打8小时8小时后24小时会有某种“重置”,这可能吗?)
希望我的问题很明确,我道歉,因为我是一个初学者。
提前致谢
(这与我之前的问题不同,请看底部,我只是复制了问题的解释)
首先,我不一定会做shift_hours
,我会像started_at
和ended_at
,并使他们日期时间列。这样,您可以在查询中进行日期数学运算,以获得工作时间,并且可以在特定日期之间进行选择。
以此为前提可能表格如此:
CREATE TABLE `employee` (
id INTEGER AUTO_INCREMENT NOT NULL,
first_name VARCHAR(32) NOT NULL,
last_name VARCHAR(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
CREATE TABLE `shift` (
id INTEGER AUTO_INCREMENT NOT NULL,
started_at DATETIME NOT NULL,
ended_at DATETIME NOT NULL,
employee_id INTEGER,
PRIMARY KEY (`id`),
KEY `shift_employee_id` (`employee_id`),
FOREIGN KEY `shift_employee_id_fk_employee_id` (`employee_id`)
REFERENCES `employee` (`id`)
ON DELETE CASCADE
) ENGINE=INNODB;
所以现在我们可以查询:
SELECT e.first_name, e.last_name, SUM(ABS(TIMESTAMPDIFF(HOUR, s.started_at, s.ended_at))) as shift_hours
FROM employee e, shift s
WHERE e.id = s.employee_id
AND s.started_at BETWEEN '2018-01-01' AND '2018-01-15'
GROUP BY e.id
HAVING shift_hours < 8;
这将使我们只有在我们提供的给定日期之间记录不到8小时的员工。
SQL小提琴:qazxsw poi(注意,我不想生成足够的数据来使用你的14天规则,但你应该明白这一点)。
其他规则是您在分配轮班时要在代码逻辑中应用的规则。虽然您可以在存储过程中执行此操作。