【问题标题】:Date Calculation in Oracle ReportsOracle Reports 中的日期计算
【发布时间】:2021-04-08 14:05:51
【问题描述】:

我从DATE_OUT (17-NOV-20 03:23 PM) 中减去DATE_IN (16-NOV-20 06:02 PM)。我希望答案是21.21(小时.分钟),但它给了我21.34,这是正确的小时数,但不是正确的分钟数。我做错了什么?

function TIME_CALCULATIONFormula return NUMBER is
begin
    RETURN ROUND((((:DATE_OUT - :DATE_IN)*24)*60)/60,2);
end;

【问题讨论】:

    标签: oracle date oracle11g oracle10g date-arithmetic


    【解决方案1】:

    正确的值是 0.34 小时 = 20.4 分钟。

    如果你想返回小时作为单位和分钟作为小数,那么你可以使用:

    function TIME_CALCULATIONFormula return NUMBER
    is
      diff INTERVAL DAY TO SECOND := (:DATE_OUT - :DATE_IN) DAY TO SECOND;
    begin
      RETURN EXTRACT( DAY FROM diff ) * 24
             + EXTRACT( HOUR FROM diff )
             + EXTRACT( MINUTE FROM diff ) / 100;
    end;
    

    function TIME_CALCULATIONFormula return NUMBER
    is
      diff INTERVAL DAY TO SECOND := CAST(:DATE_OUT AS TIMESTAMP)
                                     - CAST(:DATE_IN AS TIMESTAMP);
    begin
      RETURN EXTRACT( DAY FROM diff ) * 24
             + EXTRACT( HOUR FROM diff )
             + EXTRACT( MINUTE FROM diff ) / 100;
    end;
    

    function TIME_CALCULATIONFormula return NUMBER
    is
    begin
      RETURN TRUNC( ( :date_out - :date_in ) * 24 ) +
             MOD( ( :date_out - :date_in ) * 24 * 60, 60 ) / 100;
    end;
    

    或者,如果您不打算在 24 小时内出现时差,并且希望数字尾随零:

    function TIME_CALCULATIONFormula return VARCHAR2
    is
    begin
      RETURN TO_CHAR( DATE '1900-01-01' + ( :date_out - :date_in ), 'HH24.MI' );
    end;
    

    db小提琴here

    【讨论】:

    • @MTO bundel 感谢您的回复,当我将此代码放入报告中时,它显示函数“预期时遇到符号“day”时出现错误”我在 rports 中粘贴了相同的代码
    • @aws 我只能从 Oracle 数据库的角度回答,因为我不使用 Oracle 报告并且它在 Oracle 数据库中工作(从 dbfiddle 可以看到);但是,如果 Oracle Reports 使用稍有不同的语法,那么您必须将其从 PL/SQL 转换为报告语法。也就是说,DAY 关键字有 3 个实例,我不知道它们中的哪一个应该引发您的异常,因为您没有给出它的指示,但我已经在另一个版本中进行了编辑,它将给出相同的输出。
    • @MTO 你是 1000% 正确,先生,它在 db 上工作fiddle 我也检查了第二个,但它在报告中不起作用,我知道它的语法错误,我无法克服该语法非常感谢您为您给我的宝贵时间所做的努力,让我保持幸福和安全
    • @aws 更新为第三个选项。
    • @aws 您正在使用 NUMBER 数据类型,21.2021.2 具有相同的数值。如果你想要尾随零,那么你不能返回NUMBER,而应该返回一个格式化的字符串。
    【解决方案2】:

    你得到的结果是 not "hours.minutes" - 它是小时的十进制表示。 0.34 小时是 20 分 24 秒,这似乎是你想要的结果,直到你强制的小数点后两位的舍入误差。

    【讨论】:

    • 我知道这是十进制表示我不知道如何得到想要的结果请指导我
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多