代码编织梦想

还是 Oracle 转 PostgreSQl 的坑

整数除

假设有 Decimal(12,2) 金额=1234, int 费率=5 (表示5%)
要计算 费率=金额*费率/100,那么 Oracle 下面的表达式都没问题

with T as (
     select CAST(1234 AS DECIMAL(12,2)) A, CAST(5 AS int) R from DUAL
)
select round(A * R / 100, 2) expr1, round(A * (R / 100), 2) expr2 from T

返回

expr1expr2
61.761.7

然后对应到 PostgreSQL 中

with T as (
     select 1234 ::numeric(12,2) A,  5 ::int R
)
select round(A * R / 100, 2) expr1, round(A * (R / 100), 2) expr2 from T

返回

expr1expr2
61.70.00

瞧,expr2 变成了零,因为在 PostgreSQL 中 5 / 100 = 0 没有小数!
谁TMD整除会比普通除还常用,设计 PostgreSQL 语法的人脑子有病!

小数除

无论是 Oracle 自动转类型还是 PostgreSQL 强制转类型保证运算正确,计算中间最常见中间类型是 Decimal/Numeric
在 Oracle 中模拟一下

with T as (
     select cast(1234 as numeric) A,  cast(10 as numeric) R from DUAL
)
select R / 100 expr1, A * (R / 100) expr2 from T

返回

expr1expr2
0.1123.4

然后对应到 PostgreSQL 中

with T as (
     select 1234 ::numeric A,  10 ::numeric R
)
select R / 100 expr1, A * (R / 100) expr2 from T

返回

expr1expr2
0.10000000000000000000123.40000000000000000000

瞧,小数除法可能会多出好多无用0,并且会随加减乘等运算蔓延。通过 JDBC 字段类型对应到 BigDecimal,也会保留尾部的无用0进行显示;用 round() 只能固定小数位、和原样一致要用 trim_scale

select trim_scale(R / 100) expr1, trim_scale(A * (R / 100)) expr2 from T

返回

expr1expr2
0.1123.4
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tiger_zhao/article/details/127110156

postgresql除法保留小数-爱代码爱编程

--1 例子 postgres=# select 1/4;  ?column?  ----------         0 (1 row)         在PG里如果想做除法并想保留小数,用上面的方法却行不通,因为"/" 运算结果为取整,并且会截掉小数部分。   --2 类型转换 postgres=# select round(1::nu

postgresql:postgresql的安装和配置-爱代码爱编程

一、在CentOS上安装PostgreSQL数据库  下面我们就以CentOS系统为例,给大家讲解一下PostgreSQL的安装过程。  1.使用yum安装postgresql  [pengchengxiang@localhost ~]$ sudo yum install postgresql-server.x86_64 Loa

postgresql: postgresql数据库使用踩坑记录_李先森leecode的博客-爱代码爱编程

0、数据库依赖可以这样写: <dependency> <groupId>org.postgresql</groupId> <artifa

Linux8.1安装postgresql12失败:No match for argument: postgresql12-爱代码爱编程

针对Redhat 8.1安装postgresql12失败,报错:No match for argument: postgresql12 执行以下解决方案: 1.yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-

时序数据库:PostgreSQL+TimescaleDB安装详解(Windows)-爱代码爱编程

PostgreSQL安装+TimescaleDB安装(Windows) 一、安装环境 1.系统 2.PostgreSQL安装包 3.TimescaleDB安装包 4.Visual Studio Community 2019 二、PostgreSQL安装 1.安装PostgreSQL 2.配置环境变量 3.验证是否安装成功 三、TimescaleDB安装

postgres 判断null_postgresql基础:null的那些坑-爱代码爱编程

这篇写的是postgres,但是实际上我简单试了对于mysql也是适用的. 先简单介绍下背景,这是前几天线上的一个真实bug. 很久之前产品经理要求某个列表页排除某些类型,开发一气呵成写完上线,非常完美,突然前几天产品说现在不需要排除这几个类别了,就把要排除的配置项给清空了,结果发现列表页也空了,造成大事故啊。 图文无关 我检查发现问题代码大

postgresql时区设置,系统主机与数据库时间不一致,导致数据自动生成的时间错误_lucky@dong的博客-爱代码爱编程

忽然发现程序数据生成时间和服务器时间对不上? 排查发现:操作系统的时间与数据库的时间也不一致,究其原因是 两者时区不一致造成的!首先需要查改服务器时区和时间,然后查改数据库时区(数据库需求修改配置,否则重启后失效还原成了默认值) 1、查看系统时间与时区 [postgres@ubuntu]$ date Thu Nov 19 09:39:58 CST