postgres函数返回整数而不是数字

时间:2018-08-29 19:17:12

标签: postgresql

此postgres函数应返回一个十进制数字,但结果是一个整数。 SQL本身可以正常工作。函数结构有什么问题?输入示例为文本中的度数秒第二经度-'1012104.00E'

   f X1 X2 X3 X4 X5
1  1  6  5  7  3  6
2  1  6  4  5  5  6
3  1  5  6  3  6  6
4  1  3  5  4  3  5
5  2  5  4  7  7  7
6  2  4  1  4  2  6
7  2  5  6  6  6  5
8  2  6  7  2  5  4
9  3  5  3  4  6  9
10 3  6  6  5  5  6
11 3  5  7  4  6  8
12 3  5  3  7  8  6

谢谢。

2 个答案:

答案 0 :(得分:0)

numeric(10)是一个整数-如果您查看文档,它会采用第二个选项(比例),该选项会影响它所占的小数位数,默认为0。

https://www.postgresql.org/docs/current/static/datatype-numeric.html

您可以将其强制转换为小数:

CREATE OR REPLACE FUNCTION getSEC(inORD VARCHAR)
RETURNS NUMERIC(10) AS $$
DECLARE
 sec NUMERIC(10);
BEGIN
 sec := cast(right(substring(inOrd,0,length(inOrd)-3,2)as numeric(10))/3600;
RETURN sec;
END; $$
LANGUAGE plpgsql;

答案 1 :(得分:0)

numeric既具有“精度”又具有“刻度”。精度是数字的总数。小数位数是小数点右边的位数。 The Postgres docs provide an example

  

数字的精度是整数中有效位数的总和,即小数点两侧的位数。数值的小数位数是小数点右边小数部分中小数位数的计数。因此,数字23.5141的精度为6,小数位数为4。可以将整数视为小数位数为零。

如果不提供小数位,则默认为0,这意味着您将获得整数。因此numeric(10)是一个最大为10位的整数。 Postgres文档发现SQL标准的这一“功能”特别没用。

  

(SQL标准要求默认小数位数为0,即强制转换为整数精度。我们发现这有点用。如果您担心可移植性,请始终明确指定精度和小数位数。)

如果您想要1012104.00,则需要numeric(9, 2)。 9位数字,其中2位在小数点右边。