获得剩下的一轮

时间:2014-08-18 10:26:21

标签: php mysql sql rounding

我有一个用例,我在MySQL中有一个列,其中包含12.458等数字。

我需要获取这些数字的列表,并且需要在数据库中更新它们以便将它们四舍五入到小数点后两位,我意识到它仍然会在数据库中存储3个小数位,但我的意思是这样的我给出的示例四舍五入为12.460

我知道我可以通过MySQL轻松完成这项工作,然后通过以下查询获取数据没有问题;但是,如果数据在四舍五入的时间内以及实际选择它的时间内更新,我不想这样做。

所以我认为如果只是选择它然后用PHP进行四舍五入......

$amount = round($amount, 2);

...是的,自从我选择数据后,数据现在可能再次在数据库中发生了变化;但这不是重要的部分 - 重要的部分是对数据库中的金额运行-+操作。

所以我想要做的就是获得该轮的剩余结果,然后在mysql字段上运行一个操作..

因此...

12.457 = 12.46 = +0.003 to field
12.421 = 12.42 = -0.001 to field

不幸的是,该表不是InnoDB,我无法将其锁定更新。

有没有更好的方法来做我想要的?

修改:您可以同时执行SELECTUPDATE,以便从选择中获取更新数据吗?

2 个答案:

答案 0 :(得分:0)

CREATE TABLE YourTable
    (`ExistingValue` decimal(12,3), `ExtraValue` decimal(12,3))
;

INSERT INTO YourTable
    (`ExistingValue`, `ExtraValue`)
VALUES
    (12.458, null)
;

update YourTable
set
  ExtraValue = ExistingValue - Round(ExistingValue,2)
, ExistingValue = Round(ExistingValue,2)
;
select
*
from YourTable

| EXISTINGVALUE | EXTRAVALUE |
|---------------|------------|
|         12.46 |     -0.002 |

Demo

答案 1 :(得分:0)

如果您主要关心的是看到过时的值,那么您可以使用transaction

START TRANSACTION;
UPDATE yourTable SET  yourField = round(yourField, 2);
SELECT * FROM yourTable;
COMMIT;

即使其他进程更新了表格,您也会看到一致的结果。这依赖于InnoDB。