oracle 在SQL中只将星期日视为非工作日

7fyelxc5  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(120)

我正在寻找一个解决方案,为这个SQL的情况下,我不想考虑星期天作为一个工作日。因此,如果星期日在bkg_date和KPI之间,则不考虑它。这是我的查询;

CASE
WHEN SYSDATE - x.bkg_date - 1 <= x.dlvry_kpi THEN CONCAT(TO_CHAR(x.dlvry_kpi - (SYSDATE - x.bkg_date), 'FM00'), ' days left')
ELSE 'OKPI'
END AS AGING

字符串
它不包括星期天的条件,但是我已经尝试了这个星期天,但它仍然给一些错误;

CASE
WHEN SYSDATE - x.bkg_date <= x.dlvry_kpi THEN 
    CONCAT(
        TO_CHAR(
            x.dlvry_kpi - (
                SYSDATE - x.bkg_date 
                + FLOOR((SYSDATE - x.bkg_date) / 7) -- Subtracting Sundays
                - CASE WHEN TO_CHAR(SYSDATE - x.bkg_date + 1, 'DD') = '1' THEN 1 ELSE 0 END -- Subtracting Sundays falling on the start date
            ),
            'FM00'
        ),
        ' days left'
    )
ELSE 'OKPI'
END AS AGING

um6iljoc

um6iljoc1#

您可以找到包含日期的周的开始之间的完整周数差异,并将乘以6以获得忽略星期日的天数,然后调整开始和结束日期周围的部分周数:

CASE
WHEN SYSDATE - x.bkg_date <= x.dlvry_kpi
THEN TO_CHAR(
       x.dlvry_kpi
       - ( -- Full weeks from Monday of start week to Monday of current week
           ( TRUNC( SYSDATE, 'IW' ) - TRUNC( x.bkg_date, 'IW' ) ) * 6 / 7
           -- Add extra days in current week ignoring Sunday
           + LEAST( TRUNC( SYSDATE   ) - TRUNC( SYSDATE,   'IW' ) + 1, 6 )
           -- Subtract days in the week before the start date ignoring Sunday
           - LEAST( TRUNC( x.bkg_date ) - TRUNC( x.bkg_date, 'IW' ), 6 )
       ),
       'FM00'
      )
      || ' days left'
    )
ELSE 'OKPI'
END AS AGING

字符串
您没有在问题中包含任何示例数据,因此我们不知道您期望的输入或输出是什么,如果开始日期是星期天,您的代码似乎有一些调整,并且不清楚这样做的目的是什么。因此,测试和对星期天的开始日进行任何调整都是OP要完成的练习。

相关问题