此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
谢谢。
答案 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位在小数点右边。