如何通过员工表入职日期字段查询司龄为5的整数倍的员工列表
司龄为5整数倍的员工查询方案
核心思路
- 首先计算员工从入职日期(
join date)到当前日期的完整司龄(按年计算) - 对计算得到的司龄取模5,判断余数是否为0,满足条件的即为目标员工
各数据库实现示例
1. MySQL
SELECT `employee id`, `name`, `dob`, `join date` FROM 员工表 -- 替换为你的实际表名 WHERE TIMESTAMPDIFF(YEAR, `join date`, CURDATE()) % 5 = 0;
注意:
TIMESTAMPDIFF计算的是两个日期之间的完整年份差,会自动考虑周年日是否已过,避免出现虚司龄的问题。
2. PostgreSQL
SELECT "employee id", "name", "dob", "join date" FROM 员工表 -- 替换为你的实际表名 WHERE EXTRACT(YEAR FROM AGE(CURRENT_DATE, "join date"))::INT % 5 = 0;
3. SQL Server
SELECT [employee id], [name], [dob], [join date] FROM 员工表 -- 替换为你的实际表名 WHERE DATEDIFF(YEAR, [join date], GETDATE()) % 5 = 0 -- 可选补充:如果要精确判断满整年,避免年初入职还没到周年日就被统计,可以加下面的条件 AND DATEADD(YEAR, DATEDIFF(YEAR, [join date], GETDATE()), [join date]) <= GETDATE();
4. Oracle
SELECT "employee id", "name", "dob", "join date" FROM 员工表 -- 替换为你的实际表名 WHERE MOD(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM "join date"), 5) = 0 -- 可选补充:精确满整年判断 AND ADD_MONTHS("join date", (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM "join date"))*12) <= SYSDATE;
注意事项
- 所有字段名如果带空格,需要对应数据库的转义符包裹(MySQL用反引号,SQL Server用方括号,PostgreSQL和Oracle用双引号)
- 如果业务需要精确到入职当天才算满整年,建议加上补充的日期判断条件,避免统计到还没到周年日的员工
内容的提问来源于stack exchange,提问作者Chitrasen
相关产品推荐
相关产品推荐

