Oracle:两个日期之间的天数和排除工作日如何处理负数

Oracle: Days between two date and Exclude weekdays how to handle negative numbers

我有两个日期列,并试图测量这两个日期之间的天数,不包括周末。我得到一个负数,需要帮助解决。

Table

CalendarDate    DayNumber  FirstAssgn    FirstCnt   DayNumber2  Id  BusinessDays
5/21/2017        Sunday       5/21/17      5/21/17    Sunday    1     -1

查询:

 TRUNC(TO_DATE(A.FIRST_CONTACT_DT, 'DD/MM/YYYY')) - TRUNC(TO_DATE(A.FIRST_ASSGN_DT, 'DD/MM/YYYY'))
 - ((((TRUNC(A.FIRST_CONTACT_DT,'D'))-(TRUNC(A.FIRST_ASSGN_DT,'D')))/7)*2) 
  - (CASE WHEN TO_CHAR(A.FIRST_ASSGN_DT,'DY','nls_date_language=english') ='SUN' THEN 1 ELSE 0 END)
- (CASE WHEN TO_CHAR(A.FIRST_CONTACT_DT,'DY','nls_date_language=english')='SAT' THEN 1 ELSE 0 END) 
- (SELECT COUNT(1) FROM HUM.CALENDAR CAL
                   WHERE 1=1
                     AND CAL.CALENDAR_DATE >= A.FIRST_ASSGN_DT
                     AND CAL.CALENDAR_DATE < A.FIRST_CONTACT_DT
                     --BETWEEN A.FIRST_ASSGN_DT AND A.FIRST_CONTACT_DT                      
                     AND CAL.GRH_HOLIDAY_IND = 'Y'
                                                  ) AS Business_Days 

看起来下面的文章需要编辑...

- (CASE WHEN TO_CHAR(A.FIRST_ASSGN_DT,'DY','nls_date_language=english')='SUN' THEN 1 ELSE 0 END)

改编自my answer here

获取两个星期的星期一之间的天数(使用 TRUNC( datevalue, 'IW' ) 作为查找星期几的独立方法 NLS_LANGUAGE)然后加上星期几(星期一 = 1,星期二 = 2,依此类推,最多 5 个以忽略周末)作为结束日期并减去星期几作为开始日期。像这样:

SELECT ( TRUNC( end_date, 'IW' ) - TRUNC( start_date, 'IW' ) ) * 5 / 7
       + LEAST( end_date - TRUNC( end_date, 'IW' ) + 1, 5 )
       - LEAST( start_date - TRUNC( start_date, 'IW' ) + 1, 5 )
          AS WeekDaysDifference
FROM   your_table

与 RANGE_TEMP 作为 (

SELECT
    STARTPERIOD start_date,
    ENDPERIOD end_date 
FROM
    TABLE_DATA -- YOUR TABLE WITH ALL DATA DATE

), DATE_TEMP AS (

SELECT
    (start_date + LEVEL) DATE_ALL
FROM
    RANGE_TEMP
CONNECT BY LEVEL <= (end_date - start_date)

), WORK_TMP 作为 (

SELECT
    COUNT(DATE_ALL) WORK_DATE
FROM
    DATE_TEMP
WHERE
    TO_CHAR(DATE_ALL,'D', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('1','7')

), BUSINESS_TMP 作为 (

SELECT
    COUNT(DATE_ALL) BUSINESS_DATE
FROM
    DATE_TEMP
WHERE
    TO_CHAR(DATE_ALL,'D', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('1','7')

) SELECT L.WORK_DATE, H.BUSINESS_DATE 从 BUSINESS_TMPH, WORK_TMP大号 ;