在 MySQL 中存储出勤和获取时差的最佳方法?
Best way to store attendance and get difference of time in MySQL?
我对 SQL 语言和 MySQL 非常陌生。
我正在开发一个小时间和出勤应用程序 IN PYTHON。它所做的是记录时钟的进出时间。然后计算工作时间和returns根据工作时间计算的金额。
我想知道的是如何存储这些打卡和打卡时间的最佳方式以及如何获取时差?
至此,我为员工做了一个table如下:
CREATE TABLE employees (employee_id INT(50) AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(25),
age INT(80),
mobile_number VARCHAR(16),
national_id VARCHAR(15),
guardian_national_id VARCHAR(15),
email_id VARCHAR(150),
password VARCHAR(255),
join_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
这里的 join_date
是这个员工的创建,其余的我猜是不言自明的。
我记了2件事。它要么制作两个单独的 tables,一个用于打卡,一个用于打卡。然后计算并返回在 Python 中工作的时间。为此,我不知道如何验证这些 table 中的 employee_id。我使用 INNER JOIN
还是 FOREIGN KEY
.
或者,我可能只有一个 table 会有时钟输入和时钟输出列,但我仍然不知道如何验证 employee_id。
我知道 start_time
会是 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
但是当我更新下班时间时,这不会再次更新吗?
我迷路了。请帮助我,这很痛苦。我无法在任何地方找到我的答案。
谢谢,
这里的前进方向是创建一个单独的 table 来存储开始和结束时间。您可以将它们存储为整数(并使用 Unix 时间戳),或者更好的是,将它们存储为MySQL 日期时间类型 - 这样您就可以在 MySQL 中使用函数,例如 TIMESTAMPDIFF.
CREATE TABLE shifts (
employee_id INT(50),
start datetime NOT NULL,
finish datetime NULL,
duration int(11) GENERATED AS (TIMESTAMPDIFF(MINUTE, start, end)) STORED NULL,
PRIMARY KEY(employee_id, start)
);
然后,link 每一行使用外键引用到雇员 table 上的 employee_id 列的适当雇员 table。
CREATE INDEX employee ON shifts(employee_id);
ALTER TABLE shifts
ADD FOREIGN KEY fk_employee_shifts(employee_id)
REFERENCES employees(employee_id)
ON DELETE CASCADE
ON UPDATE CASCADE
The above is probably pseudo code as I'm a beer into my evening :)
我通过使用存储的虚拟列来保存 TIMESTAMPDIFF 值,使 table 变得更加智能。这样您就不需要将数据拉入您的应用程序来计算每个会话的长度;让数据库完成工作!请注意时区...
我对 SQL 语言和 MySQL 非常陌生。 我正在开发一个小时间和出勤应用程序 IN PYTHON。它所做的是记录时钟的进出时间。然后计算工作时间和returns根据工作时间计算的金额。
我想知道的是如何存储这些打卡和打卡时间的最佳方式以及如何获取时差?
至此,我为员工做了一个table如下:
CREATE TABLE employees (employee_id INT(50) AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(25),
age INT(80),
mobile_number VARCHAR(16),
national_id VARCHAR(15),
guardian_national_id VARCHAR(15),
email_id VARCHAR(150),
password VARCHAR(255),
join_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
这里的 join_date
是这个员工的创建,其余的我猜是不言自明的。
我记了2件事。它要么制作两个单独的 tables,一个用于打卡,一个用于打卡。然后计算并返回在 Python 中工作的时间。为此,我不知道如何验证这些 table 中的 employee_id。我使用 INNER JOIN
还是 FOREIGN KEY
.
或者,我可能只有一个 table 会有时钟输入和时钟输出列,但我仍然不知道如何验证 employee_id。
我知道 start_time
会是 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
但是当我更新下班时间时,这不会再次更新吗?
我迷路了。请帮助我,这很痛苦。我无法在任何地方找到我的答案。 谢谢,
这里的前进方向是创建一个单独的 table 来存储开始和结束时间。您可以将它们存储为整数(并使用 Unix 时间戳),或者更好的是,将它们存储为MySQL 日期时间类型 - 这样您就可以在 MySQL 中使用函数,例如 TIMESTAMPDIFF.
CREATE TABLE shifts (
employee_id INT(50),
start datetime NOT NULL,
finish datetime NULL,
duration int(11) GENERATED AS (TIMESTAMPDIFF(MINUTE, start, end)) STORED NULL,
PRIMARY KEY(employee_id, start)
);
然后,link 每一行使用外键引用到雇员 table 上的 employee_id 列的适当雇员 table。
CREATE INDEX employee ON shifts(employee_id);
ALTER TABLE shifts
ADD FOREIGN KEY fk_employee_shifts(employee_id)
REFERENCES employees(employee_id)
ON DELETE CASCADE
ON UPDATE CASCADE
The above is probably pseudo code as I'm a beer into my evening :)
我通过使用存储的虚拟列来保存 TIMESTAMPDIFF 值,使 table 变得更加智能。这样您就不需要将数据拉入您的应用程序来计算每个会话的长度;让数据库完成工作!请注意时区...