首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >清点第二天起计的工作日

清点第二天起计的工作日
EN

Stack Overflow用户
提问于 2014-02-27 12:39:01
回答 2查看 220关注 0票数 1

我有一个函数,计算两个日期之间的工作日。问题是它只能从开始日期的第二天开始计算。如果开始日期是在周末(星期六或星期日)或星期五,那么它必须开始计算从,星期一,

目前,这段代码将计算周末开始的完美日期,但是如果开始日期是一个工作日,那么它将计算1天太多的,因为它还计算起始日,当它应该从第二天开始时。

代码语言:javascript
复制
CREATE DEFINER=`root`@`localhost` FUNCTION `BusinessDaysBetweenDates`(d1 DATE, d2 DATE) RETURNS int(11)
BEGIN
    DECLARE bDaysInPeriod INT;

    SET bDaysInPeriod=0;
    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;
END

测试用例:使用start date 01-01-2014和end date 03-01-2014,当它生成2 days时将生成3 days。如果通过从结果中缩短1天来修复它,那么start date of 04-01-2014和end date of 08-01-2014将生成2 days而不是3 days

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-27 12:58:15

你解决这个问题的方法似乎是可行的。当您在应用程序中添加一个任意节假日表时,这将是特别可行的。

我相信你的计算中有一个简单的错误。试着改变你的逻辑来做到这一点:

代码语言:javascript
复制
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;

以下是一些潜在的测试用例:

代码语言:javascript
复制
 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

我想这是你想要的。

票数 1
EN

Stack Overflow用户

发布于 2014-02-27 13:05:46

在调用函数之前向开始一天添加一天。

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

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

代码语言:javascript
复制
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_TERRITORY。在这里,我以为你想不包括周末,有一个1=周日和7=周六的设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22068771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档