我有一张桌子" task_table"包含列 -
Task_id,Start_date,End_date
我还有一个"配置"具有记录的表格,该记录表明一周中的哪几天是工作日。 该表有两列 -
week_day,isHoliday
并且此表包含七个记录,因为week_days是星期一,星期二.....星期日,并且每条记录都有一个条目为1或0.如果一天是任何组织中的假日,那么将有0对此天。就像一个组织每周三和周五都有假期一样,那么周三和周五就会有0个假期。
现在,我想创建一个SQL查询来获取Task_id,Start_date,End_date以及每项任务消耗的总天数。 (这些天是任务start_date和end_date之间的天数,不包括在"配置"表中配置的假日天数。)
答案 0 :(得分:1)
我现在没有时间完全回答这个问题,但我会做的是:
获取Start_date周开始时的日期,以及End_date周结束时的日期(您可以根据星期几date_add
获得此日期。
然后你想要对它们进行日期差异,除以7,乘以2,然后删除你想要添加的任何数据(例如,如果开始日期是星期四,那么你需要从结果中删除一个,如你将在紧接着的星期三计算一个。
我明天会写出这些代码(它已经很晚了 - 比如现在大约14个小时左右。)如果其他人没有提出更好的答案的话。
编辑:对,没有正确阅读这个问题,但这个策略仍适用于一点点摆弄。说到这些,here is the fiddle of my solution。
归结为以下代码:
set @holidaysPerWeek = (select sum(isHoliday) from configuration);
select
Task_id,
((dateDiff(
DATE_ADD(End_Date, INTERVAL 7 - DayOfWeek(End_Date) DAY),
DATE_ADD(Start_Date, INTERVAL -DayOfWeek(Start_Date) + 1 Day)) + 1) / 7)
* @holidaysPerWeek
- (select sum(isHoliday) from configuration where week_day > DayOfWeek(End_Date))
- (select sum(isHoliday) from configuration where week_day < DayOfWeek(Start_Date)),
DayOfWeek(End_Date)
from task_table
这正是我之前所说的,但是周期数为#34;如果整个星期都被覆盖,则首先选择整个星期的假期数,然后分别删除分别在开始日期和结束日期之前或之后的假期。