在Oracle SQL中计算工作日(无函数或过程)

yoc*_*him 10 sql date-arithmetic oracle11g

我正在尝试计算Oracle select中两个日期之间的工作日.当我的计算给出给定日期的大多数结果时,我得到了这一点(我将它与excel中的NETWORKDAYS进行比较),但有时它在2天到-2天之间变化 - 我不知道为什么......

这是我的代码:

SELECT
((to_char(CompleteDate,'J') - to_char(InstallDate,'J'))+1) - (((to_char(CompleteDate,'WW')+ (52 * ((to_char(CompleteDate,'YYYY') - to_char(InstallDate,'YYYY'))))) - to_char(InstallDate,'WW'))*2) as BusinessDays
FROM TABLE
Run Code Online (Sandbox Code Playgroud)

谢谢!

yoc*_*him 23

解决方案,最后:

SELECT OrderNumber, InstallDate, CompleteDate,
  (TRUNC(CompleteDate) - TRUNC(InstallDate) ) +1 - 
  ((((TRUNC(CompleteDate,'D'))-(TRUNC(InstallDate,'D')))/7)*2) -
  (CASE WHEN TO_CHAR(InstallDate,'DY','nls_date_language=english')='SUN' THEN 1 ELSE 0 END) -
  (CASE WHEN TO_CHAR(CompleteDate,'DY','nls_date_language=english')='SAT' THEN 1 ELSE 0 END) as BusinessDays
FROM Orders
ORDER BY OrderNumber;
Run Code Online (Sandbox Code Playgroud)

感谢您的所有回复!

  • 实际上它确实适用于所有日期:)你只是使用错误的日期:)**2012-02-15**是星期三,2012-02-18是星期六.我想你想计算相同的日子,但在2013年 - 它给了2天(再次正确!). (2认同)

小智 5

我考虑了上面讨论的所有不同的方法,并提出了一个简单的查询,它给出了两个日期之间一年中每个月的工作日数:

WITH test_data AS ( SELECT TO_DATE('01-JAN-14') AS start_date, TO_DATE('31-DEC-14') AS end_date
FROM dual ), all_dates AS (
SELECT td.start_date, td.end_date, td.start_date + LEVEL-1 as week_day FROM test_data td CONNECT BY td.start_date + LEVEL-1 <= td.end_date) SELECT TO_CHAR(week_day, 'MON'), COUNT(*)
FROM all_dates WHERE to_char(week_day, 'dy', 'nls_date_language=AMERICAN') NOT IN ('sun' , 'sat') GROUP BY TO_CHAR(week_day, 'MON');

请随意根据需要修改查询.