Функция postgres возвращает целое число вместо числового - PullRequest
0 голосов
/ 29 августа 2018

Эта функция postgres должна возвращать десятичное число, но вместо этого результатом является целое число. SQL сам по себе работает правильно. Что не так со структурой функции? Пример ввода - это долгота в секундах в тексте - «1012104.00E»

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;

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

numeric принимает как «точность», так и «масштаб». Точность - это общее количество цифр. Масштаб - это сколько из них может быть справа от десятичной дроби. В документации Postgres приведен пример .

Точность числа - это общее количество значащих цифр во всем числе, то есть количество цифр по обеим сторонам десятичной точки. Шкала чисел - это количество десятичных цифр в дробной части справа от десятичной точки. Таким образом, число 23,5141 имеет точность 6 и шкалу 4. Целые числа можно считать равными нулю.

Если вы не предоставите шкалу, по умолчанию она равна 0, что означает, что вы получите целое число. Таким образом, numeric(10) является целым числом с максимум 10 цифрами. Документы Postgres считают эту «особенность» стандарта SQL особенно бесполезной.

(Стандарт SQL требует шкалы по умолчанию, равной 0, т. Е. Приведение к целочисленной точности. Мы находим это несколько бесполезным. Если вас беспокоит переносимость, всегда указывайте точность и масштаб явно.)

Если вы хотите 1012104.00, вам понадобится numeric(9, 2). 9 цифр, 2 из которых находятся справа от десятичной дроби.

0 голосов
/ 29 августа 2018

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...