【问题标题】:How to count "Sunday" of the month to count absent employees如何计算一个月的“星期日”来计算缺勤员工
【发布时间】:2021-02-08 04:30:55
【问题描述】:

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

这是一个使用的示例数据库:

emp0003 表的

NIK Name
01190301 Susan

dvc0004 表的

NIK Enroll
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 的结果:

NIK Name TOTAL ABSENT OF THE MONTH
01190301 Susan 1

应该是结果:

NIK Name TOTAL ABSENT OF THE MONTH
01190301 Susan 0

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

【问题讨论】:

  • 请包含一个 db fiddle 演示(如果您想要高质量的答案而无需长时间等待)。这是 SQLServer 还是 MySQL?
  • 样本数据(如 DDL+DML)和预期结果是这些问题的必备条件。
  • 我添加了一个示例数据库、我的查询结果和我想要的结果.. @mickmackusa
  • @DaleK :我添加了一个示例数据库、我的查询结果和我想要的结果。
  • db fiddle 演示在哪里?我主要通过手机做志愿者,所以我很少花时间创建一个模式来解决别人的问题。使用 db fiddle,您的问题将变得更有吸引力。

标签: php mysql sql database


【解决方案1】:

您可以使用以下查询。

SELECT  (total_day_of_month-Total_holiday_till_Now-Total_Valid_Attendance) AS Total_absence FROM
(SELECT SUM(CASE WHEN  DAYOFWEEK(dvc0004.Enroll)<>1 then 1 ELSE 0 END) AS Total_Valid_Attendance,
DAY(CURRENT_DATE) AS total_day_of_month,
  ROUND((
      (unix_timestamp(CURRENT_DATE) - unix_timestamp(DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY)) ) /(24*60*60)
      -7+WEEKDAY(DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY))-WEEKDAY(CURRENT_DATE)
    )/7)

 + if(WEEKDAY(DATE_SUB(CURRENT_DATE, INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY)) <= 6, 1, 0)
 + if(WEEKDAY(CURRENT_DATE) >= 6, 1, 0) AS Total_holiday_till_Now   
FROM emp0003
LEFT  JOIN dvc0004 ON emp0003.NIK = dvc0004.NIK      
WHERE emp0003.nik = '01190301' 
AND MONTH(CURRENT_DATE)=MONTH(dvc0004.Enroll) 
AND YEAR(CURRENT_DATE)=YEAR(dvc0004.Enroll) ) AS  main_query

【讨论】:

  • 试试这个/仅代码的答案在 Stack Overflow 上的价值很低,因为它们错过了教育/授权 OP 和成千上万未来研究人员的机会。
【解决方案2】:

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

您可以通过下面的代码行轻松计算周一至周六员工在场的情况(考虑到 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 function to find the number of working days between two dates

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多