在MySQL里面有人员的在职日期和离职日期,如何去除所有的周三的日期呢,在计数,求给个思路

例如当月日期

SQL YYcDkDca 发布于 2024-7-31 09:35
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
1
JL98Lv6中级互助
发布于2024-7-31 11:19(编辑于 2024-7-31 11:24)

你是要算人员的在职天数吗?但是要排除周三?

-------------------------------------------------------------------------------------------------------

一个基本的思路是:

  1. 遍历在职日期和离职日期之间的每一天。

  2. 检查每一天是否是周三(DAYOFWEEK() 函数返回1(星期天)到7(星期六)的数字,其中星期三对应的是4或5,这取决于你的MySQL服务器设置的first day of week)。

  3. 如果不是周三,则将其计入总数。

但是,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,你可能需要使用其他方法来生成日期范围,比如连接一个足够大的数字表或使用存储过程。

  • YYcDkDca YYcDkDca(提问者) 对,是算人员的在职天数,现在是人员的在职和入职时间都查出来了,在踢掉周三太麻烦了
    2024-07-31 11:39 
  • YYcDkDca YYcDkDca(提问者) 况且还要去考虑他的入职,离职时间
    2024-07-31 11:40 
  • JL98 JL98 回复 YYcDkDca(提问者) 最简单其实是创建日历表
    2024-07-31 11:46 
  • JL98 JL98 回复 YYcDkDca(提问者) 参考一下:https://blog.51cto.com/u_16213352/9042966
    2024-07-31 11:47 
最佳回答
0
华莉星宸Lv7高级互助
发布于2024-7-31 09:37

用函数判断是否为周三,踢掉周三的日期就行了啊

 

https://blog.csdn.net/weixin_50223520/article/details/135624543

image.png

  • YYcDkDca YYcDkDca(提问者) 我查出来的数据是一个时间段,在职2024-07-01,离职2024-07-31
    2024-07-31 09:47 
  • 华莉星宸 华莉星宸 回复 YYcDkDca(提问者) 没关系啊,直接把周三的日期过滤掉,或是在统计的时候,用case when把周三的日期的数量设置为0,其他的设置为1,在求和就可以统计到了
    2024-07-31 09:50 
最佳回答
0
Z4u3z1Lv6专家互助
发布于2024-7-31 09:38

已离职为例

SELECT * FROM (

SELECT *,WEEKDAY(离职日期) [week_] FROM TABLE WHERE .......

) A WHERE A.WEEK_<>2

最佳回答
0
WyangLv4见习互助
发布于2024-7-31 09:44

利用函数:DAYOFWEEK

SELECT 

your_date_column --你数据库表对应的字段名

FROM your_table_name --你数据库表

WHERE DAYOFWEEK(your_date_column) != 4 

1:代表周日

2:代表周一 --依次类推

  • 3关注人数
  • 285浏览人数
  • 最后回答于:2024-7-31 11:24
    请选择关闭问题的原因
    确定 取消
    返回顶部