MySQL 查找记录大于3个月的数据

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的更多查询功能和技巧,可以参考官方文档或其他相关资料进行了解。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程