你是要算人员的在职天数吗?但是要排除周三?
-------------------------------------------------------------------------------------------------------
一个基本的思路是:
遍历在职日期和离职日期之间的每一天。
检查每一天是否是周三(DAYOFWEEK() 函数返回1(星期天)到7(星期六)的数字,其中星期三对应的是4或5,这取决于你的MySQL服务器设置的first day of week)。
如果不是周三,则将其计入总数。
但是,MySQL的SQL查询并不直接支持循环遍历
日期范围,因此我们需要使用一种方法来生成这个日期范围。有几种方法可以做到这一点,比如使用数字表或递归的公用表表达式(CTE,在MySQL 8.0及以上版本中可用)。
以下是一个使用递归CTE来生成日期范围并排除周三的示例:
----------------------------------------------------------------------------
WITH RECURSIVE date_range AS (
SELECT 入职日期 AS date FROM 员工表
WHERE 员工ID = ? -- 假设我们针对某个特定的员工
UNION ALL
SELECT date + INTERVAL 1 DAY
FROM date_range
WHERE date < 离职日期)
SELECT COUNT(*) AS total_days
FROM date_range
WHERE DAYOFWEEK(date) NOT IN (4, 5); -- 假设星期三和星期四为4和5(取决于你的MySQL设置)
------------------------------------------------------------------------------
注意:
DAYOFWEEK() 函数返回的数值可能因MySQL的default_week_format设置而异。默认情况下,它可能返回1(星期天)到7(星期六),但如果你更改了此设置,返回值可能会改变。这里我假设星期三对应的是4(这通常是默认设置下的情况),但如果你发现不是,请根据你的MySQL设置进行调整。
上述SQL中的?是一个占位符,代表你需要查询的员工的ID。你需要用实际的员工ID替换它,或者通过其他方式指定要查询的员工。
递归CTE在MySQL 8.0及以上版本中可用。如果你的MySQL版本低于8.0,你可能需要使用其他方法来生成日期范围,比如连接一个足够大的数字表或使用存储过程。