`
peijunlin2008
  • 浏览: 171303 次
  • 性别: Icon_minigender_1
  • 来自: 河北省
社区版块
存档分类
最新评论

如何得出一个月有多少工作日?

阅读更多
CREATE OR REPLACE FUNCTION Get_WorkingDays(
  ny IN VARCHAR2
) RETURN INTEGER IS
/*------------------------------------------------------------------------------
函数名称:Get_WorkingDays
中文名称:求某一年月中共有多少工作日
作者姓名: XINGPING
编写时间: 2004-05-22
输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
返 回 值:整型值,包含的工作日数目。
算法描述:
    1).列举出参数给出的年月中的每一天。这里使用了一个表(ljrq是我的库中的一张表。这个表可以是有权访问的、记录条数至少为31的任意一张表或视图)来构造出某年月的每一天。
    2).用这些日期和一个已知星期几的日期相减(2001-12-30是星期天),所得的差再对7求模。如果所求年月在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于-6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模.
    3).过滤掉结果集中值为0和6的元素,然后求count,所得即为工作日数目。     
-----------------------------------------------------------------------------*/
Result INTEGER;
BEGIN
  SELECT COUNT(*) INTO Result FROM  
(SELECT MOD(MOD(q.rq-to_date('2001-12-30','yyyy-mm-dd'),7),7) weekday 
    FROM ( SELECT to_date(ny||t.dd,'yyyymmdd') rq
      FROM (SELECT substr(100+ROWNUM,2,2) dd
            FROM ljrq z WHERE Rownum<=31 ) t
      WHERE to_date(ny||t.dd,'yyyymmdd') 
BETWEEN to_date(ny,'yyyymm')         
AND last_day(to_date(ny,'yyyymm') )
      )q
   ) a   
   WHERE a.weekday NOT IN(0,6);   
  RETURN Result;  
END Get_WorkingDays;
另一个版本
CREATE OR REPLACE FUNCTION Get_WorkingDays(
  ny IN VARCHAR2
) RETURN INTEGER IS


/*-------------------------------------------------------------------------------
函数名称:Get_WorkingDays
中文名称:求某一年月中共有多少工作日
作者姓名: XINGPING
编写时间: 2004-05-23
输入参数:NY:所求包含工作日数的年月,格式为yyyymm,如200405
返 回 值:整型值,包含的工作日数目。
算法描述:使用Last_day函数计算出参数所给年月共包含多少天,根据这个值来构造一个循环。在这个循环中先求这个月的每一天与一个已知是星期天的日期(2001-12-30是星期天)的差,所得的差再对7求模。如果所求日期在2001-12-30以前,那么所得的差既是负数,求模后所得值范围为大于 -6,小于0,如-1表示星期六,故先将求模的结果加7,再求7的模. 如过所得值不等于0和6(即不是星期六和星期天),则算一个工作日。     
----------------------------------------------------------------------------*/

 
Result INTEGER := 0;
  myts INTEGER;      --所给年月的天数
  scts INTEGER;      --某天距2001-12-30所差的天数
  rq   DATE;
  djt INTEGER := 1;   --
BEGIN
  myts := to_char(last_day(to_date(ny,'yyyymm')),'dd');  
  LOOP
    rq := TO_date(ny||substr(100+djt,2),'yyyymmdd');
    scts := rq - to_date('2001-12-30','yyyy-mm-dd');
    IF MOD(MOD(scts,7)+7,7) NOT IN(0,6) THEN
      Result := Result + 1;
    END IF;
    djt := djt + 1;  
    EXIT WHEN djt>myts;
  END LOOP;  
  RETURN Result;  
END Get_WorkingDays;


以上两个版本的比较
第一个版本一条SQL语句就可以得出结果,不需要编程就可以达到目的。但需要使用任意一张有权访问的、记录条数至少为31的一张表或视图。
第二个版本需要编程,但不需要表或者视图。
这两个版本都还存在需要完善的地方,即没有考虑节日,如五一、十一、元旦、春节这些节假期都没有去除。这些节假日应该维护成一张表,然后通过查表来去除这些节假日。

更通用的做法:
先写一个函数用于计算一个日期是周几(0-6)
create or replace function DayOfWeek(iDate in Date) return integer is
  Result integer;
begin
  SELECT MOD(MOD(iDate-to_date('2001-12-30','yyyy-mm-dd'),7)+7,7) weekday into Result from dual;
  return(Result);
end DayOfWeek;


然后可以在一个Sql 语句中任意统计一段时间内的工作日天数,或者周几都可以。








分享到:
评论

相关推荐

    根据开始日期和工作日天数计算结束日期

    例如,假设一个项目从2022年1月1日开始,计划进行10个工作日,且2022年1月1日是周五,1月2日和1月3日是周末,1月4日是新年假期,那么实际开始工作的日期是1月5日。计算结束日期时,我们需要排除1月7日(周六)和1月8...

    开始日期+工作日 推算结束日期

    不需要编程,纯使用函数解决,根据开始日期和工作日,推算结束日期 1. 解决法定节假日 2. 解决调休等特殊日子 3. 需要每年维护一次“特殊日期”清单。

    asp.net+c#做的计算任意两天的间隔和工作日天数的源码

    本项目是一个使用ASP.NET+C#编写的源码,其主要功能是计算两个日期之间的总天数以及工作日的天数。这个功能在很多实际场景下都有应用,例如财务管理、人力资源规划或项目进度管理。 首先,让我们深入理解ASP.NET...

    计算某时间段内的工作日及时间

    这需要一个节假日数据库,可以是静态的,也可以是动态获取的。静态数据库需要定期更新,而动态获取则可以通过集成在线接口实现,例如调用国家或地区的官方API获取节假日信息。在没有互联网的情况下,可以采用离线...

    煤炭去产能战略下“276工作日”制度的实施策略

    根据当前情况分析和研判,得出这样一个基本认识,即在目前情况下在煤炭行业提出并实施"276工作日"是适宜的,是符合我国煤炭行业实际情况的,从实践所取得的初步效应来看也是比较科学的。因此,提出了继续完善执行"276工作...

    工作日手机信令数据深圳01.zip

    标题“工作日手机信令数据深圳01.zip”暗示了这是一个包含有关深圳地区工作日手机信令活动的数据集。这通常涉及到移动通信网络中的位置信息,可以用于人口流动研究、城市规划、市场分析等多个领域。信令数据是手机与...

    工作日手机信令数据深圳18.zip

    标题“工作日手机信令数据深圳18.zip”暗示了这是一个包含有关深圳特定工作日期间手机用户活动的数据集。这个数据集可能源自电信运营商,通过收集手机用户的信号连接信息来提供对城市移动行为的洞察。信令数据是移动...

    2009年7月+12月日语N1日语1级考试真题及答案+解析+MP3听力原文.zip

    《2009年7月+12月日语N1日语1级考试真题及答案+解析+MP3听力原文》是一个针对日语学习者的宝贵资源,它包含了两个重要时期——2009年7月和12月的日语最高级别考试,即N1级别的官方真题、详细答案、解析以及对应的MP3...

    2019年1月2日神经网络的输出有方向吗?实验数据

    本实验数据集,名为“2019年1月2日神经网络的输出有方向吗?”,是一个用于探究神经网络输出特性的研究案例。这个数据集包含了8个CSV(逗号分隔值)文件,这种格式是数据科学中常用的数据存储方式,便于数据分析和...

    关于职工全年月平均工作时间和工资折算问题的通知(制度范本、DOC格式).doc

    在考虑到104天的休息日和11天的法定节假日后,得出年工作日为365天减去这两部分,即250天。接着,将年工作日进一步转换为季度和月度工作日,分别为62.5天/季和20.83天/月。工作小时数的计算则是在这些基础上乘以每天...

    隔一日问题

    例如,可以将"2013年4月7日"解析为一个Date对象或datetime实例。然后,我们增加一天,这通常是通过调用一个增加日期的方法,如`date.addDays(1)`或`datetime.timedelta(days=1)`来实现。然而,增加一天后,我们需要...

    EXCEL中的Networkdays函数.pdf

    如果6月份有8个周末和1个端午节(6月9日),则`NETWORKDAYS`会自动排除这些日期,得出的结果是22个工作日。 #### 示例2:计算实习员工工资 对于实习员工,如果他们的工资是按照工作日计算的,我们可以使用`...

    面试题解析:如何估算煎饼摊大妈一个月的收入?.pdf

    假设大妈每个月工作30天的话,每个月卖出的煎饼总数就是185个×30个工作日;再假设每个煎饼是6块钱,这样就能算出来每个月的收入了。 通过这种方法,我们可以估算出煎饼摊大妈一个月的收入是33300元,但是,这个...

    旧金山建筑许可证数据集.rar

    背景描述 建筑许可证是政府机构签发的官方批准文件,允许你或你的承包商在自己的土地上进行...根据这些数据,你能建议哪一个工作日是参观建筑检查部门的最佳时间吗?根据这些数据,你能对这个城市的发展得出什么结论吗?

    关于职工工作时间有关问题的复函.doc

    5. 工时计算方法:年度工作日、季度工作日、月度工作日分别通过减去休息日和法定节假日得出,每日工作小时数通常为8小时。对于综合计算工时,需确保在计算周期内总工时不超法定标准。 6. 特殊情况下的工作安排:如...

    doomsday-battle:“ Doomsday”算法,用于查找给定日期的工作日,并以8种语言实现,以争夺谁最强!

    您将所有这些数字相加即可得出工作日: 这一天(即2049年8月18日是18日) 月份代码(从一月到十二月为6、2、2、5、0、3、5、1、4、6、2、4) “世纪”代码(mod 4)(年份编号的前两位数字,即2014年为20) 代码...

    JS如何判断某天为星期几

    函数中使用了一个字符串`keystr`,这个字符串包含了每个月相对于1月的天数差,但是这个方法并不是标准的或广为人知的算法,它依赖于一个特定的基线年份(2000年),并且通过一系列复杂的数学运算来得出结果。...

    薪酬管理考试题.docx

    这是因为一年有365天,减去104个周末(双休日),再减去法定节假日(一般为11天),得出的结果是251个工作日。然后,将251除以12个月,得到大约20.92个工作日,但通常会四舍五入为21.75天。因此,正确答案是D:21.75...

    可以显示每个月的日历,月份

    而`count_days_of_month()`则需要根据年份判断是否为闰年,以确定二月有28天还是29天。 综上所述,这段代码展示了如何在C语言中生成日历的基本方法,涉及到了日期的验证、星期的计算以及日历布局的规划等知识点。...

    动网论坛IP数据库8月30日

    标题中的“动网论坛IP数据库8月30日”指的是一个特定版本的IP数据库,用于动网论坛系统。动网论坛是中国早期流行的网络社区软件,它允许用户进行互动交流,而IP数据库在这种环境下则扮演了重要的角色。IP数据库通常...

Global site tag (gtag.js) - Google Analytics