Mysql 计算从第二天开始的日期之间的工作日

Mysql 计算从第二天开始的日期之间的工作日,mysql,sql,Mysql,Sql,我有一个计算两个日期之间工作日的函数。问题是它必须从开始日期后的第二天开始计数。如果开始日期是周末周六、周日或周五,则必须从周一开始计算 目前,此代码将完美地计算在周末开始的日期,但如果开始日期在工作日,那么它将计算过多的1天,因为它还计算应从第二天开始的开始日期 测试用例:使用2014年1月1日的开始日期和2014年1月3日的结束日期,它将产生3天,而它应该产生2天。如果您只需从结果中减去1天即可解决此问题,那么2014年1月4日的开始日期和2014年1月8日的结束日期将产生2天而不是3天。您

我有一个计算两个日期之间工作日的函数。问题是它必须从开始日期后的第二天开始计数。如果开始日期是周末周六、周日或周五,则必须从周一开始计算

目前,此代码将完美地计算在周末开始的日期,但如果开始日期在工作日,那么它将计算过多的1天,因为它还计算应从第二天开始的开始日期


测试用例:使用2014年1月1日的开始日期和2014年1月3日的结束日期,它将产生3天,而它应该产生2天。如果您只需从结果中减去1天即可解决此问题,那么2014年1月4日的开始日期和2014年1月8日的结束日期将产生2天而不是3天。

您解决此问题的方法似乎可行。当您在应用程序中添加任意假日表时,它将特别有用

我相信你的计算有一个简单的错误。尝试更改逻辑以执行此操作:

SET bDaysInPeriod=0;
SET d1=d1+INTERVAL 1 DAY;    /* start counting the day after start date */
WHILE d1<=d2 DO
    IF DAYOFWEEK(d1) BETWEEN 2 AND 6 THEN
        SET bDaysInPeriod=bDaysInPeriod+1;
    END IF;
    SET d1=d1+INTERVAL 1 DAY;
END WHILE;
RETURN bDaysInPeriod;

我想这正是您想要的。

在调用该函数之前,在开始日添加一天

如果开始日是星期五,你将得到星期六,这将不被计算在内,因为它不是一个工作日。如果开始日是星期天,则以星期一结束,这将是第一天被计算在内

或者您可以跳过该函数并在查询中执行它

WITH days AS (
   SELECT TRUNC(:start_date) + LEVEL AS my_day
   FROM dual
   CONNECT BY TRUNC(:start_date) + LEVEL <= TRUNC(:end_date)
)
SELECT COUNT(*) AS workdays
FROM days
WHERE TO_CHAR(my_day, 'D') NOT IN ('1', '7');

需要排除的天数取决于要排除的实际天数以及NLS设置,确切地说是NLS_区域。在这里,我假设您希望排除周末,并设置为1=星期天和7=星期六。

您是否希望严格执行此功能?如果这有帮助的话,这个结果可以通过SQLI得到;这只是在谷歌上搜索7秒后出现的@AlmaDo-但仅当您使用uility表格或一些乏味的UNION@Strawberry对于这种情况,有一些通用的紧凑序列生成器。但是-是的,它将使用UNION,但是,无论期望的间隔是什么,它们的计数总是相同的。你能举一个代码失败的例子吗?只需在循环开始之前的开始日期中添加1,您就可以修复它吗?
 start date  end date   returned value

   Mon         Tues        1
   Sun         Mon         1
   Fri         Mon         1
   Fri         Tues        2
   Sat         Sun         0
   Sat         Mon         1
   Sun         Tues        2
WITH days AS (
   SELECT TRUNC(:start_date) + LEVEL AS my_day
   FROM dual
   CONNECT BY TRUNC(:start_date) + LEVEL <= TRUNC(:end_date)
)
SELECT COUNT(*) AS workdays
FROM days
WHERE TO_CHAR(my_day, 'D') NOT IN ('1', '7');