首页 > 解决方案 > 如何计算每月的“星期日”来计算缺勤员工

问题描述

我在计算一个月内的员工缺勤率时遇到问题。在我的查询中,它仍然计算本月“星期日”的日期,这不应该计算在内。

这是使用的示例数据库:

emp0003 表

尼克 姓名
01190301 苏珊

dvc0004 表

尼克 注册
01190301 2021-02-08 07:20:39
01190301 2021-02-06 14:37:08
01190301 2021-02-06 07:57:42
01190301 2021-02-05 17:29:00
01190301 2021-02-05 08:09:54
01190301 2021-02-04 19:21:38
01190301 2021-02-04 08:12:44
01190301 2021-02-03 17:44:02
01190301 2021-02-03 08:06:27
01190301 2021-02-02 18:52:15
01190301 2021-02-02 08:02:32
01190301 2021-02-01 20:07:13
01190301 2021-02-01 07:55:49
01190301 2021-01-30 16:20:56
01190301 2021-01-30 07:59:45

这是我的查询 sql:

SELECT
    emp0003.NIK,
    emp0003.`Name`,
    DAY(CURRENT_DATE) - COUNT(
        DISTINCT
        DATE(LEFT((`dvc0004`.`Enroll`), 10)),
        (CASE
            WHEN LEFT(( `dvc0004`.`Enroll`), 10) 
                AND MONTH(LEFT((`dvc0004`.`Enroll`), 10)) = MONTH(CURRENT_DATE()) 
                AND YEAR(LEFT((`dvc0004`.`Enroll`), 10)) = YEAR(CURRENT_DATE())
            THEN 1 
        END)
    ) AS 'TOTAL ABSENT OF THE MONTH'            
FROM emp0003
LEFT JOIN dvc0004 ON emp0003.NIK = dvc0004.NIK      
WHERE emp0003.nik = '01190301' 

这是我的查询 sql 的结果:

尼克 姓名 本月缺勤总数
01190301 苏珊 1

应该是结果:

尼克 姓名 本月缺勤总数
01190301 苏珊 0

因为到目前为止,这个月只过了一个“星期天”

标签: phpmysqlsqldatabase

解决方案


如果我理解正确,您想计算工作日(周一至周六)的任何员工缺勤。要实现这一点,您需要知道给定日期范围内的工作日数以及这些天是否有任何员工。

您可以通过下面的代码行轻松计算周一到周六之间员工的存在情况(考虑到LEFT ( ( dvc0004. Enroll), 10 )表示有效日期)

(CASE WHEN weekday(LEFT ( ( `dvc0004`.`Enroll` ), 10 ) )>0 then 1 else 0 end) AS 'TOTAL ABSENT OF THE MONTH'

但是仅仅从 current_date() 中减去计数是行不通的。您还需要考虑当月第一天和当前日期的星期日数。在这里,我分享一个链接来实现这一点:

MySQL函数查找两个日期之间的工作日数


推荐阅读