8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Oracle 查询获取两个日期之间的工作日数

mfirry 1月前

114 0

我们使用的是 Oracle 11。在我们的 CASE WHEN 语句中,我需要检查两个日期之间的天数是否 > 3 个工作日(不包括周末和节假日)。因此,如果 Date1 = 1/21/19 (

我们正在使用 Oracle 11。

在我们的 CASE WHEN 语句中,我需要检查两个日期之间的天数是否 > 3 个工作日(因此不包括周末和节假日)。

所以,如果

日期 1 = 1/21/19(星期一)

日期 2 = 1/18/19(星期五)

日期 1 和日期 2 之间的工作日数是 1 天,而不是 3 天。

CASE WHEN TO_DATE(SETTLEMENT_DATE, 'YYYY-MM-DD') - TO_DATE(TRADE_DATE, 
'YYYY-MM-DD')  > 3  THEN 0  --> this includes weekend and holidays
WHEN CODE = 1 THEN 1
WHEN CODE =2 THEN 2
ELSE 3
END AS MyColumn

谢谢。

帖子版权声明 1、本帖标题:Oracle 查询获取两个日期之间的工作日数
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由mfirry在本站《date》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您不需要使用分层查询,并且可以独立于 NLS 设置来执行此操作,以 TRUNC( date_value, 'IW' ) 查找 ISO 周的开始(始终是星期一)。

    ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
    

    将找到包含开始日期的 ISO 周开始与包含结束日期的 ISO 周开始之间的工作日数。

    然后只需添加最后一周的工作日:

    + LEAST( TRUNC( end_date   ) - TRUNC( end_date,   'IW' ) + 1, 5 )
    

    并减去开始日期之前第一个 ISO 周的天数:

    - LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
    

    综合起来,可得出:

    Oracle 设置

    CREATE TABLE table_name ( start_date, end_date ) AS
    SELECT DATE '2018-12-30' + LEVEL, DATE '2019-01-10' 
    FROM DUAL
    CONNECT BY LEVEL <= 11
    

    询问

    SELECT TO_CHAR( start_date, 'YYYY-MM-DD "("DY")"') AS start_date,
    
           ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
           + LEAST( TRUNC( end_date   ) - TRUNC( end_date,   'IW' ) + 1, 5 )
           - LEAST( TRUNC( start_date ) - TRUNC( start_date, 'IW' ), 5 )
             AS Num_Week_Days
    FROM   table_name;
    

    输出

    START_DATE       | NUM_WEEK_DAYS
    :--------------- | ------------:
    2018-12-31 (MON) |             9
    2019-01-01 (TUE) |             8
    2019-01-02 (WED) |             7
    2019-01-03 (THU) |             6
    2019-01-04 (FRI) |             5
    2019-01-05 (SAT) |             4
    2019-01-06 (SUN) |             4
    2019-01-07 (MON) |             4
    2019-01-08 (TUE) |             3
    2019-01-09 (WED) |             2
    2019-01-10 (THU) |             1
    

    db<>在这里摆弄

  • 谢谢大家的帮助。我最终使用了 MT0 的解决方案。但是,我如何在此查询中排除假期?假设我有一个假期日历表,其中的 HolidayDates 列包含所有假期,例如:2018 年 12 月 25 日、2018 年 12 月 31 日等。

  • @faujong.com/questions/43632677/… 如果这不能回答您的问题,那么您应该提出一个新问题,因为它超出了这个问题的范围。

  • 您可以创建这样的函数,其用途 conditional aggregation 如下

    SQL> alter session set NLS_TERRITORY="AMERICA"
    SQL> create or replace function get_working_days( 
                                                 i_settlement_date tab.settlement_date%type, 
                                                 i_trade_date      tab.trade_date%type
                                               ) return pls_integer is
      o_working_days  pls_integer;                                         
    begin
      select nvl(sum(case when
                  to_char(trade_date + level,'Dy') in ('Sat','Sun') 
                 then 0
                 else 1
                 end ),0)
      into o_working_days
      from tab
     where settlement_date >= trade_date
     connect by level <= i_settlement_date - i_trade_date + 1;
    
     return o_working_days;
    end; 
    

    获取两个日期之间的工作日(包括两个边界日期)。

    即,对于您的情况,它将返回 2,包括星期一和星期五。

    编辑: 如果您不想创建函数,请使用以下带有替代变量的 &i_settlement_date 查询 &i_trade_date

      select nvl(sum(case when
                  to_char(trade_date + level,'Dy') in ('Sat','Sun') 
                 then 0
                 else 1
                 end ),0) as working_days
      from tab
     where settlement_date >= trade_date
     connect by level <= &i_settlement_date - &i_trade_date + 1;
    

    并在提示时分别输入样本值 date'2019-01-21' date'2019-01-18'

  • to_char(trade_date + level,'D','NLS_DATE_LANGUAGE=AMERICAN') 的结果取决于当前用户会话 NLS_TERRITORY。'NLS_DATE_LANGUAGE=AMERICAN' 对其无效。在 ('Sat','Sun') 中使用 to_char(trade_date + level,'Dy','NLS_DATE_LANGUAGE=AMERICAN')

  • @WernfriedDomscheit 好的,回想起之前的讨论,你关于领土的说法是正确的,谢谢。

  • 谢谢。此语句会更改每个人的 NLS_TERRITORY,还是仅更改我的会话?由于我没有权限在 Oracle 上创建函数,有没有不使用函数来执行此操作的方法?

  • @faujong 不客气。它只会影响您的会话,对于受影响的所有数据库,将使用 alter system 并且大多数情况下需要重新启动。我正在编辑答案,以便您执行没有函数的查询。

返回
作者最近主题: