我正在尝试使用 date_sub 减去当前日期 - 11 天。我想排除周末。这是我目前所拥有的:
DATE_SUB(now(), INTERVAL 11 day)
不确定如何排除周末...感谢任何帮助。
最佳答案
这道题是关于减去工作日的。假设周末是周六-周日,我们可以这样写解法:
我们知道:
- 每个完整的一周有 5 个工作日。
- 因此,
- num_of_weeks =
floor(@num_working_days / 5)
- delta_days =
@num_working_days % 5
- num_of_weeks =
因此,第一个近似值可能是:
SET @num_working_days = 4; -- pick any integer
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
但是,这在以下和类似情况下不起作用:
if today is
Monday
andnum_working_days % 5
is 1, the above will errornously give youSunday
, when it should give youFriday
.
通常,如果出现以下情况,它将失败:
WEEKDAY(NOW()) - @num_working_days % 5 < 0
为此,只要满足此条件,就必须再减去 2 天。
- 溢出天数 =
2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
因此,第二个近似值是:
SET @num_working_days = 4;
SET @overflow_days = 2 * (WEEKDAY(NOW()) - @num_working_days % 5 < 0)
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(NOW(), INTERVAL @num_days DAY)
最后,
只要 now()
就会有效不在 week-end
中天。对于这种情况,您需要替换 now()
在上面的公式中加上前一周的结束日期:
- weekend_correction =
DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY)
这导致看起来很糟糕但可以正常工作:
SET @num_working_days = 4;
SET @weekend_correction = DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) % 5 DAY);
SET @overflow_days = 2 * (WEEKDAY(@weekend_correction) - @num_working_days % 5 < 0);
SET @num_days = 7 * FLOOR(@num_working_days / 5) - @num_working_days % 5;
SELECT DATE_SUB(@weekend_correction, INTERVAL @num_days DAY);
现在,在生产中,我建议您在您的 MySQL 服务器上创建一个函数来封装此逻辑,并且您可以在需要减去工作日的任何时候调用此函数。
关于mysql - 如何从 date_sub 中排除周末?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29677718/