我试着在某些日期做减法运算,在我的特殊情况下,我只需要减去工作日(不包括周末,即周日和周六)
我的table是这样的:
date | days_to_subtract | dayName
23-04-2004 | 3 | Friday
23-05-2004 | 5 | Monday
21-04-2004 | 7 | Tuesday
25-04-2004 | 30 | Monday
01-04-2004 | 22 | Thursday
我的目标是计算一个新的列(新的日期),从日期中减去天\u到\u sub,只考虑业务(劳动)日,排除(或忽略)周末日。
我试过这样的方法:
SELECT
CASE WHEN dayName = "Monday" then date_sub(date, days_to_subtract + 2)
WHEN dayName = "Tuesday" then date_sub(date, days_to_subtract + 1)
ELSE date_sub(date, days_to_subtract)
END AS newColumn
FROM
"MyTable"
但当减法天数大于5天时,这将不起作用。
有没有建议使用简单的sql而不是复杂的函数来解决这个问题?
1条答案
按热度按时间laik7k3q1#
我们先来解释一下你的情况:
星期一)假设我们的位置是星期一,那么当减去n(虚拟)天时,您期望(真实)减去的结果如下:
星期二)假设我们的位置是星期二,那么当减去n(虚拟)天时,您期望的(真实)减去的结果如下:
星期三)假设我们的位置是星期三,那么当减去n(虚拟)天时,您期望(真实)减去的结果如下:
我们可以注意到,在这个逻辑中间有一个数学演算。如果我们以这种方式索引一周中的几天:
那么,与前面的演算相匹配的公式是:
例1)
假设我们需要从星期三减去2天,那么前面的公式将简化为:
例2)
假设我们需要从星期三减去8天(在这种情况下,我们在减去期间有两个周末),那么前面的公式将减少为:
因此,基于这个公式,并操作mysql dayofweek()方法来生成我们的index\u of()函数,我们可以进行下一个查询:
最后一列calculatedday将包含您希望从减法中获得的日期,其他列仅用于检查数学演算的步骤。我希望你能理解这背后的逻辑,因为我花了一些时间去弄清楚并解释它。您可以在下面的链接中看到工作示例:
1) 小提琴
2) sql小提琴