所以,下一个问题:‘),我有以下@MatBailie提供给我的查询here(再次感谢!):

SELECT
  taskname,
  employee,
  SUM(
    DATEDIFF(
      LEAST(     enddate, '2023-12-31'),
      GREATEST(startdate, '2023-01-01')
    )
    +1
  ) AS total_days,
FROM
  schedule
WHERE
  startDate <= '2023-12-31'
  AND
  endDate   >= '2023-01-01'
GROUP BY
  employee,
  taskname

这个查询将告诉我某个员工在给定时间段内在某项任务上花费了多少天,它非常有效!

然而,我想做的下一件事是从some个任务的DATEDIFF之和中减go 非工作日(例如,当任务在名为‘Actives’的引用表中具有"COUNT_NON_WORKING_DAYS=0"时).

例如,我的日程表还记录每个员工的休假天数(休假天数也被安排为任务).但当然,周末或节假日的休假天数不应计入一个人一年的休假天数.(请注意,我确实考虑过只在工作日/非节假日安排假期,但在我使用的计划软件中,这并不是一个实际的选项,因为员工申请从日期A到日期B的假期,而这个请求是按原样批准或拒绝的(如果他们想休假3周,他们不会提出3个假期请求,如果他们想go 度假3周的话).

因此,如果员工休假10天,这将被算作10天假期,但这个假期可能有1到2个周末,所以员工休假的天数之和应该是6、7或8天,而不是10天.此外,如果它有像复活节星期一这样的假期(我的假期的所有日期都在一个PHP数组中),这也应该减go .

我已经try 了前面提到的here个解决方案,但我无法让它们工作:(A)因为它们在SQL服务器中;(B)因为它们不允许放入假日数组;(C)也不允许根据事件类型打开和关闭减法.

以下是我试图解释在我的伪SQL中try 做的事情:

SELECT
  taskname,
  employee,
  IF( activities.count_non_working_days=1,  
    -- Just count the days that fall in the current year: 
    SUM(
      DATEDIFF(
        LEAST(      enddate, '2023-12-31'),
        GREATEST( startdate, '2023-01-01')
      ) 
      + 1
    ) AS total_days,
    -- Subtract the amount of saturdays, sundays and holidays:
    SUM(
      DATEDIFF(
        LEAST(      enddate, '2023-12-31'),
        GREATEST( startdate, '2023-01-01')
      ) 
      - [some way of getting the amount of saturdays, sundays and holidays that fall within this date range]
      + 1
    ) AS total_days
  )
FROM
  schedule
LEFT JOIN
  activities
  ON activity.name = schedule.name
WHERE
  startDate <= '2023-12-31'
  AND
  endDate   >= '2023-01-01'
GROUP BY
  employee,
  taskname

我知道上面的查询可能在很多层面上是错误的,但我希望它能澄清我想要做的事情.

再次感谢大家的帮助!

编辑:基本上我需要this左右,但在MySQL中,最好有一个switch ,根据任务类型打开或关闭减法.

编辑2:澄清一下:我的日程表包含所有活动,包括节假日.例如,某些记录可能包括:

employee taskname startDate endDate
Mr. Anderson Programming 2023-01-02 2023-01-06
Mr. Anderson Programming 2023-01-09 2023-01-14
Mr. Anderson Vacation 2023-01-14 2023-01-31

在另一个表格中,编程被定义为"COUNT_NON_WORKING_DAYS=1",因为在周末工作应该算数,而假期被定义为"COUNT_NON_WORKING_DAYS=0",因为周末休息一天不应该计入您的总休假天数.

因此,本月的总数应说明:

安德森先生已经做了11天的编程工作(其中1天是在周六)

安德森已经请了12天假(因为这段时间的两个周末不算休假).

推荐答案

创建一个日程表,其中包含每个感兴趣的日期(比如2000-01-01到2099-01-01),并包括诸如is_working_day之类的列,这些列可以设置为True/Flase或1/0.然后,您可以根据需要更新该列,并在查询中联接该表,以获得员工已登记的工作日期.

简而言之,您计算的是相关日期,而不是扣除不相关的日期.

SELECT
  s.employee,
  s.taskname,
  COUNT(*)    AS total_days,
FROM
(
    schedule    AS s
  INNER JOIN
    activities  AS a
      ON  a.taskname = s.taskname
)
INNER JOIN
  calendar    AS c
    ON  c.calendar_date  >= s.startDate
    AND c.calendar_date  <= s.endDate
    AND c.is_working_day >= 1 - a.count_non_working_days 
WHERE
      c.calendar_date >= '2023-01-01'
  AND c.calendar_date <= '2023-12-31'
GROUP BY
  s.employee,
  s.taskname

然后,您的日程表还可以包括诸如IS_DIEWARD、IS_BANK_HOLIDATION、IS_FUBAR、IS_ANGING等标志,并且IS_WINKING_DAY可以是这些输入的计算列.


Note on 100 filter...

   WHERE
     ( count_non_working_day = 1 AND is_working_day IN (0, 1) )
     OR
     ( count_non_working_day = 0 AND is_working_day IN (   1) )


   -- change to (1 - count_non_working_day)

   WHERE
     ( (1 - count_non_working_day) = 0 AND is_working_day IN (0, 1) )
     OR
     ( (1 - count_non_working_day) = 1 AND is_working_day IN (   1) )


   -- simplify

   WHERE
     ( (1 - count_non_working_day) <= is_working_day )
     OR
     ( (1 - count_non_working_day) <= is_working_day )
  

   -- simplify

   WHERE
     ( (1 - count_non_working_day) <= is_working_day )

演示:https://dbfiddle.uk/YAmpLmVE

Mysql相关问答推荐

查找关联数据库表的超集

左联接重复问题

错误:数据包顺序错误.GET:0预期:10 node JS MySQL

我如何才能从MySQL过程中获取LARAVEL端的数据?

了解MySQL_stmt_BIND_NAMED_Param()-MySQL C API

无法连接到扩展坞MySQL Unix套接字

Eloquent:通过国外模型得到平均分

如何分解分组依据的数据?

SQL: Select TEXT 字段的子字符串比整个值快

如何在 axios 请求中将更新的设置状态值作为参数传递

在 SQL 中的 case 语句之后将新列转换为 INT

处理 Visits 表中数百万行的最佳方法是什么?

了解 SQL 中的元组语法

进行 MySQL COUNT 查询

主键应该始终是无符号的?

MySql - 默认情况下主键是唯一的吗?

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

MySQL中的行值增加和减少1

如何计算表格的列数

电话号码和地址的mysql数据类型