MySQL 查找记录大于3个月的数据
在MySQL中,有时我们需要查询一些记录,这些记录是在特定的时间段内创建或更新的。在这种情况下,我们可以使用GROUP BY和HAVING关键字。在本篇文章中,我们将在MySQL数据库中查找记录大于3个月的数据。
阅读更多:MySQL 教程
准备数据
我们需要创建一个MySQL表格来测试我们的查询。下面是一个简单的表,包含了公司员工的出勤纪录。
CREATE TABLE attendance (
id INT PRIMARY KEY AUTO_INCREMENT,
employee_name VARCHAR(50),
time_in DATETIME,
time_out DATETIME
);
然后,我们往表里添加一些数据。
INSERT INTO attendance (employee_name, time_in, time_out)
VALUES
("Tom", '2021-10-01 08:00:00', '2021-10-01 16:00:00'),
("Tom", '2021-09-30 08:00:00', '2021-09-30 16:00:00'),
("Tom", '2021-09-29 08:00:00', '2021-09-29 16:00:00'),
("Tom", '2021-09-28 08:00:00', '2021-09-28 16:00:00'),
("Tom", '2021-09-27 08:00:00', '2021-09-27 16:00:00'),
("Jack", '2021-10-05 08:00:00', '2021-10-05 16:00:00'),
("Jack", '2021-10-04 08:00:00', '2021-10-04 16:00:00'),
("Jack", '2021-10-03 08:00:00', '2021-10-03 16:00:00'),
("Jack", '2021-10-02 08:00:00', '2021-10-02 16:00:00'),
("Jack", '2021-10-01 08:00:00', '2021-10-01 16:00:00'),
("Mary", '2021-09-01 08:00:00', '2021-09-01 16:00:00'),
("Mary", '2021-08-31 08:00:00', '2021-08-31 16:00:00'),
("Mary", '2021-08-30 08:00:00', '2021-08-30 16:00:00'),
("Mary", '2021-08-29 08:00:00', '2021-08-29 16:00:00'),
("Mary", '2021-08-28 08:00:00', '2021-08-28 16:00:00');
查询语句
我们使用以下SQL语句查询距离当前时间大于三个月的记录。
SELECT employee_name, MIN(time_in) AS first_time_in, MAX(time_out) AS last_time_out
FROM attendance
GROUP BY employee_name
HAVING last_time_out <= NOW() - INTERVAL 3 MONTH;
这个查询将返回一份员工名单,这些员工已经三个月没有打卡记录了。
+---------------+---------------------+---------------------+
| employee_name | first_time_in | last_time_out |
+---------------+---------------------+---------------------+
| Mary | 2021-08-28 08:00:00 | 2021-09-01 16:00:00 |
+---------------+---------------------+---------------------+
查询解析
首先,我们使用MIN函数和MAX函数从attendance表中检索time_in和time_out字段的最小值和最大值。这将告诉我们员工的第一次打卡和最后一次打卡时间。
SELECT employee_name, MIN(time_in) AS first_time_in, MAX(time_out) AS last_time_out
FROM attendance
GROUP BY employee_name;
结果如下:
+---------------+---------------------+---------------------+
| employee_name | first_time_in | last_time_out |
+---------------+---------------------+---------------------+
| Jack | 2021-10-01 08:00:00 | 2021-10-05 16:00:00 |
| Mary | 2021-08-28 08:00:00 | 2021-09-01 16:00:00 |
| Tom | 2021-09-27 08:00:00 | 2021-10-01 16:00:00 |
+---------------+---------------------+---------------------+
然后,在HAVING子句中使用last_time_out <= NOW() – INTERVAL 3 MONTH过滤出大于三个月的记录。NOW()返回当前系统时间,INTERVAL 3 MONTH表示三个月的时间间隔。
HAVING last_time_out <= NOW() - INTERVAL 3 MONTH;
这将返回只有Mary的结果,因为48个小时(2天)前的时间点与2014-10-13 00:00:00相比为2014-08-13 00:00:00。
因为Mary是唯一一个离开时间大于3个月的员工。
总结
在MySQL中,我们可以使用GROUP BY和HAVING子句来查询一些记录,这些记录是在指定的时间段内创建或更新的。在本文中,我们演示了如何查询3个月前的记录。关于MySQL的更多查询功能和技巧,可以参考官方文档或其他相关资料进行了解。
极客教程