没有整数表达式的Ints子串

时间:2017-02-26 06:11:45

标签: sql int

我正在尝试更新数据库中不通过数据库本身执行浮点数/小数的值。前端"翻译"小数的也是不一致的。

因此,A列可能需要1234并将其转换为12.34,B列可以将其转为1.234。

当将两列相乘时,我最终会得到一个需要减少的长整数。但是,整数表达式没有一致性。

员工A: 工资率:20.67美元。在db:20670中 工作小时数:3.95。在db:395

8164。 需要LEFT(rate *hrs, 5) = 816418079 * 800 = 14463200

员工B: 工资率:18.07美元。在db:18079中 工作小时数:8。在db:800

14464。 需要LEFT(rate*hrs,5) = 1446ffmpeg -nostdin -loglevel error -y -threads 0 -filter_complex aevalsrc=0 -t 4 /home/ec2-user/videocreation/temp/silence.m4a

还有另一种方法可以减少int而不中继整数表达式吗?

1 个答案:

答案 0 :(得分:0)

我会假设这是一个不幸的尝试,以避免浮点不精确,它只是一个混乱的架构;数据库本身是一个支持浮点数的普通SQL数据库。

它不是试图处理这个混乱,而是会耗费大量时间并产生许多完全可以避免的错误,并修复它。创建一个新模式(可能是一个新数据库),该模式使用正确的decimal列并将所有数据转换为其中。 decimalnumeric通常都是精确的,不会出现浮点错误(尽管可能会对它们进行数学计算)。所有新代码都应使用此代码,尽可能多地切换现有代码。

然后将所有现有的混乱表格转换为具有相同名称的视图 。这些视图将十进制列转换回整数。这使您可以向后兼容您无法修复(或不了解)的查询,同时保留一组理智的表格。

例如......

create table employee_pay2 (
    EmployeeID integer references(employee),
    Rate decimal(10,2),
    Hours decimal(10,2)
);

create view employee_pay_view
as
select
    EmployeeID,
    Rate * 1000,
    Hours * 100
from employee_pay;

确定该视图有效后,请删除旧表并将视图重命名为旧表名(SQL Server recommends you drop and recreate the view rather than renaming it

现在任何旧查询都将使用该视图。您甚至可以使用查询日志来查找仍然以旧方式执行此操作的杂散代码。