所以,下一个问题:‘),我有以下@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天假(因为这段时间的两个周末不算休假).