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