и Postgres функция возвращает целочисленное значение, а не числовое



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



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;


Заранее благодарю.

519   2  

2 ответов:

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

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

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

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

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

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;

Comments

    Ничего не найдено.