mysql - 如何从 date_sub 中排除周末?

标签 mysql date

我正在尝试使用 date_sub 减去当前日期 - 11 天。我想排除周末。这是我目前所拥有的:

DATE_SUB(now(), INTERVAL 11 day)

不确定如何排除周末...感谢任何帮助。

最佳答案

这道题是关于减去工作日的。假设周末是周六-周日,我们可以这样写解法:

我们知道:

  • 每个完整的一周有 5 个工作日。
  • 因此,
    • num_of_weeks = floor(@num_working_days / 5)
    • delta_days = @num_working_days % 5

因此,第一个近似值可能是:

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 and num_working_days % 5 is 1, the above will errornously give you Sunday, when it should give you Friday.

通常,如果出现以下情况,它将失败:

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/

相关文章:

PHP插入mysql数据库, 'WHERE field '等于我的选择

mysql - 使用mysql select将数据放入另一个表中?

mysql - 让 mysql 显示带有引用的表

r - 如何让 vapply 返回一个日期向量?

javascript - jQuery Datepicker 错误显示

mysql - 用其他字段的COUNT更新一列是SQL吗?

c# - 如何使用 List< string> 参数调用方法

javascript - 月/日/年月日 HH :MM:SS AM/PM date validation regular expression in javascript

MySQL:我想汇总我的员工成本并按员工和日期进行分组

java - 在 python 中将 java System.currentTimeMillis() 转换为日期