在Oracle中,什么是总是得到小数点后两位的最好方法?


What is the best method to always get 2 decimal places in Oracle?

什么是最好的方法,总是得到2小数点后的值返回由Oracle?

目前我正在包装所有数据库相关的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, '.', '');
}

注意:我不能编辑数据库模式等

你可以直接用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");

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

使用TO_CHAR格式修饰符

例如,

SQL> SELECT TO_CHAR(123456.7890, 'fm9999999.99') FROM dual;
TO_CHAR(123
-----------
123456.79
输出数据类型字符串,而不是数字

使用 round 来四舍五入,并保持数据类型为number。

例如,

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