【问题标题】:What is the best method to always get 2 decimal places in Oracle?在 Oracle 中始终获得 2 位小数的最佳方法是什么?
【发布时间】:2016-01-09 16:32:49
【问题描述】:

在 Oracle 返回的值中始终获得 2 位小数的最佳方法是什么?

目前我将所有与数据库相关的 PHP 函数包装在 number_format 等中,但我想将它们直接移动到 SQL 查询中。

当我连接到 Oracle 时,是否可以设置一个环境变量或类似的环境变量,这样我就不必这样做了?

function OrderNetTotal($id) {
    global $dbh;

    $sth = $dbh->prepare("SELECT net_total FROM order_totals WHERE order_no = $id");

    $sth->execute();
    $result = $sth->fetchAll();

    return number_format((float)$result[0]['0'], 2, '.', '');
}

注意:我无法编辑数据库架构等。

【问题讨论】:

    标签: php sql oracle number-formatting


    【解决方案1】:

    你可以使用ROUND()

    $sth = $dbh->prepare("SELECT ROUND(net_total,2) FROM order_totals WHERE order_no = $id");
    

    甚至更好:

    $sth = $dbh->prepare("SELECT TO_CHAR(net_total,'99.99') FROM order_totals WHERE order_no = $id");
    

    【讨论】:

    • 这会添加.00,即使它没有返回?
    • 第二个返回######?
    • 因为 TO_CHAR 返回的是字符串,而不是数字。如果要检索数据类型,请使用 ROUND。要处理零值或空值,请使用 decode 和 nvl。有关详细信息,请参阅我的答案。
    【解决方案2】:

    取决于您是只想以某种格式显示数字还是要进行一些算术运算。

    要显示,请使用 TO_CHAR格式修饰符

    例如,

    SQL> SELECT TO_CHAR(123456.7890, 'fm9999999.99') FROM dual;
    
    TO_CHAR(123
    -----------
    123456.79
    

    输出数据类型字符串而不是数字

    要四舍五入,并让数据类型保持为数字,请使用 ROUND

    例如,

    SQL> SELECT ROUND(123456.7890, 2) FROM dual;
    
    ROUND(123456.7890,2)
    --------------------
               123456.79
    

    您可以使用DECODE在数字为零时不四舍五入,并使用NVL处理空值。

    SQL> WITH data AS
      2    ( SELECT 123.456 num FROM dual UNION
      3    SELECT NULL FROM dual UNION
      4    SELECT 0 FROM dual
      5    )
      6  SELECT num, NVL(DECODE(num, 0, 0, ROUND(num, 2)), 0) num FROM data;
    
           NUM        NUM
    ---------- ----------
             0          0
       123.456     123.46
                        0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多