如何找出HANA中两个日期之间的工作日数?

时间:2015-11-16 21:57:05

标签: date sap hana

如何找出SAP HANA中两个日期之间的工作日数(周一至周五)?我们不必考虑假期。 我们不能使用WORKDAYS_BETWEEN(),因为我们没有TFACS表。

2 个答案:

答案 0 :(得分:0)

以下是你在sql中的表现:

  1. 计算整周的数量,乘以5
  2. 添加剩余天数:从工作日结束日期减去工作日开始日期,更正周末(最少...),更正结转(+5)
  3. 第二部分可以简化一点,这样你就不必两次写减法了。

    此处为开始日期为“2015-12-04”且结束日期为“2015-12-19”的示例:

    SELECT ROUND( DAYS_BETWEEN (TO_DATE ('2015-12-04', 'YYYY-MM-DD'), TO_DATE('2015-12-19', 'YYYY-MM-DD')) / 7, 0, ROUND_DOWN) * 5
                           + ( case
                                 when WEEKDAY (TO_DATE('2015-12-19', 'YYYY-MM-DD') ) - WEEKDAY (TO_DATE('2015-12-04', 'YYYY-MM-DD')) >= 0
                                   then least( WEEKDAY (TO_DATE('2015-12-19', 'YYYY-MM-DD')), 5) - least( WEEKDAY (TO_DATE('2015-12-04', 'YYYY-MM-DD')), 5)
                                 else
                                       least( WEEKDAY (TO_DATE('2015-12-19', 'YYYY-MM-DD')), 5) - least( WEEKDAY (TO_DATE('2015-12-04', 'YYYY-MM-DD')), 5) + 5
                              end )
    
               "Workdays" FROM DUMMY;
    

    - > 11

答案 1 :(得分:0)

我更喜欢在此处创建用户定义的函数,以便在HANA SQLScript代码中使用,如下所示

Create Function CalculateWorkDays (startdate date, enddate date)
returns cnt integer
LANGUAGE SQLSCRIPT AS
begin
    declare i int;
    cnt := 0;
    i := 0;
    while :i <= days_between(:startdate, :enddate)
    do
        if WEEKDAY( ADD_DAYS(:startdate,:i) ) < 5
        then
            cnt := :cnt + 1;
        end if;
        i := :i + 1;
    end while;
end;

请注意,上面的代码块似乎包含一个不必要的循环。 另一方面,如果您有其他表,如部门假期或个人假期等。在WHILE循环中检查这些表可能很有用。请参考以下SQL教程Calculate the Count of Working Days Between Two Dates,其中我创建了一个类似的SQL函数,用于检查自定义工作日历或假日日历。

以下是将该函数称为样本

的方法
select CalculateWorkDays('20170101', '20170131') as i from dummy;

我希望它有所帮助,