postgresql error-ERROR: input is out of range[英] postgresql error - ERROR: input is out of range

本文是小编为大家收集整理的关于postgresql error-ERROR: input is out of range的处理方法,想解了postgresql error-ERROR: input is out of range的问题怎么解决?postgresql error-ERROR: input is out of range问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

下面的功能不断返回此错误消息.我认为也许Double_precision字段类型是什么原因引起的,我试图使用铸件,但这不是它,或者我没有做对了... help?

这是错误:

ERROR:  input is out of range
CONTEXT:  PL/pgSQL function "calculate_distance" line 7 at RETURN

********** Error **********

ERROR: input is out of range
SQL state: 22003
Context: PL/pgSQL function "calculate_distance" line 7 at RETURN

这是功能:

 CREATE OR REPLACE FUNCTION calculate_distance(character varying, 
double precision, double precision, 
double precision, double precision)

      RETURNS double precision AS
    $BODY$ 
            DECLARE earth_radius double precision; 

            BEGIN 
                    earth_radius := 3959.0; 

                    RETURN earth_radius * acos(sin($2 / 57.2958) * 
sin($4 / 57.2958) + cos($2/ 57.2958) * cos($4 / 57.2958) 
* cos(($5 / 57.2958) - ($3 / 57.2958)));
            END; 
            $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION calculate_distance(character varying, 
double precision, double precision, double precision, 
double precision) OWNER TO postgres;



    //I tried changing (unsuccessfully) that RETURN line to: 

    RETURN CAST( (earth_radius * acos(sin($2 / 57.2958) 
* sin($4 / 57.2958) + cos($2/ 57.2958) * cos($4 / 57.2958) 
* cos(($5 / 57.2958) - ($3 / 57.2958))) ) AS text);

推荐答案

看一下此解决方案:

id/12376732.post@talk.nabble.com

问题确实是ACOS()不在[-1,1]范围内,并且 发生这种情况是因为它计算了相同的距离 LAT,长对(相同位置)

我添加了一个l1.id <> l2.

martijn van Oosterhout写道:

在2007年8月18日星期六,03:21:02 pm -0700,Dustov写道:

我的数据库只是有一个新错误,我不知道为什么(因为我 没有故意对此表进行任何更改).有人有吗? 一个 想法哪个输入超出了范围 - 或可能出现的问题?

我可以想象的查询中唯一的东西是 ACOS()需要在-1和1之间(否则结果 会很复杂).

我会尝试看看与ACO的论点是什么,但可能是 舍入的一些角案.

希望这会有所帮助,

我在计算坐标之间的距离时遇到了相同的错误,但上面的提示解决了我的问题.

其他推荐答案

迟到,但存在相同的问题,并且由于ACOS参数不在外面[-1,1](也许1.01)而发生. 在计算ACO之前,您应该以整数为单位

这样:

        RETURN  (earth_radius * acos(CAST ((sin($2 / 57.2958) 
sin($4 / 57.2958) + cos($2/ 57.2958) * cos($4 / 57.2958) 
 cos(($5 / 57.2958) - ($3 / 57.2958)) AS INTEGER)) );

其他推荐答案

这是由于浮点舍入错误,将值降至>1.

在服用ACO之前,用最少,最大

acos(least(greatest(...),-1),1));

完整替换:

 CREATE OR REPLACE FUNCTION calculate_distance(character varying, 
double precision, double precision, 
double precision, double precision)

      RETURNS double precision AS
    $BODY$ 
            DECLARE earth_radius double precision; 

            BEGIN 
                    earth_radius := 3959.0; 

                    RETURN earth_radius *
acos(least(greatest(
    sin($2 / 57.2958) * 
    sin($4 / 57.2958) + cos($2/ 57.2958) * cos($4 / 57.2958) 
    * cos(($5 / 57.2958) - ($3 / 57.2958))
),-1),1));
            END; 
            $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION calculate_distance(character varying, 
double precision, double precision, double precision, 
double precision) OWNER TO postgres;

本文地址:https://www.itbaoku.cn/post/1763983.html