MySQL 14天重置查询

问题描述 投票:0回答:1

我正在建立一个基本系统,随机选择2名员工,以支持半天的业务。我真的在努力使用数据库,以及我如何实际完成这项任务,因为他们已经列出了某些使它非常棘手的规则。

商业规则:

  • 工程师一天最多可以做半天班。
  • 工程师连续几天不能有半天班。
  • 每位工程师应该在任何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小时的用户(我怎么能解决这1​​4天的问题,有人打8小时8小时后24小时会有某种“重置”,这可能吗?)

希望我的问题很明确,我道歉,因为我是一个初学者。

提前致谢

(这与我之前的问题不同,请看底部,我只是复制了问题的解释)

php sql database
1个回答
1
投票

首先,我不一定会做shift_hours,我会像started_atended_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天规则,但你应该明白这一点)。

其他规则是您在分配轮班时要在代码逻辑中应用的规则。虽然您可以在存储过程中执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.