System.Data.Entity.Core.EntityCommandExecutionException Произошла недопустимая операция с плавающей запятой - PullRequest
3 голосов
/ 14 марта 2019

Я получаю следующее исключение при выполнении этой команды sql:

SELECT (ACOS(SIN(PI()*51.0026829600855/180.0)*SIN(PI()*51.0026829600855/180.0)+COS(PI()*51.0026829600855/180.0)*COS(PI()*51.0026829600855/180.0)*COS(PI()*13.7910680057092/180.0-PI()*13.7910680057092/180.0))*6371) AS foo

System.Data.Entity.Core.EntityCommandExecutionException Произошла недопустимая операция с плавающей запятой ”

Как мне изменить запрос, чтобы он запускался?Мой подход был

ROUND( statement, 2) 

, но он не работает.

Это поиск местоположения по долготе и широте

Обновление: также не работает с SQL Server 2017http://sqlfiddle.com/#!18/9eecb/38598

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Округление оператора внутри ACOS() first

SELECT (ACOS( ROUND(SIN(PI()*51.0026829600855/180.0)*SIN(PI()*51.0026829600855/180.0)+COS(PI()*51.0026829600855/180.0)*COS(PI()*51.0026829600855/180.0)*COS(PI()*13.7910680057092/180.0-PI()*13.7910680057092/180.0), 15))*6371) AS foo

это из-за плавающего разговора в sql.без округления сервер sql предполагает, что входное значение немного больше 1, вы можете округлить входное значение или вычесть небольшое значение, например, 0,00000000000001, прежде чем передать его в acos()

1 голос
/ 14 марта 2019

Результат для этого запроса: 6371:

SELECT (
SIN(PI()*51.0026829600855/180.0)*SIN(PI()*51.0026829600855/180.0)+COS(PI()
    *51.0026829600855/180.0)*COS(PI()*51.0026829600855/180.0)*COS(PI()
    *13.7910680057092/180.0-PI()*13.7910680057092/180.0)
)*6371
 AS foo

Однако, 6371 не имеет права на ACOS.ACOS должно быть меньше или равно 1.

Например:

SELECT ACOS(1) -- OK
SELECT ACOS(1.1) -- An invalid floating point operation occurred.

ОБНОВЛЕНИЕ:

Этот запрос может вернутьзначение больше 1. Поэтому попробуйте использовать оператор CASE:

SELECT 
(
ACOS
(
    CASE WHEN      
        (SIN(PI()*51.0026829600855/180.0)*SIN(PI()*51.0026829600855/180.0)
        +COS(PI()*51.0026829600855/180.0)*COS(PI()*51.0026829600855/180.0)
        *COS(PI()*13.7910680057092/180.0-PI()*13.7910680057092/180.0)) > 1
        THEN 1
    ELSE      
        (SIN(PI()*51.0026829600855/180.0)*SIN(PI()*51.0026829600855/180.0)
        +COS(PI()*51.0026829600855/180.0)*COS(PI()*51.0026829600855/180.0)
        *COS(PI()*13.7910680057092/180.0-PI()*13.7910680057092/180.0)) 
    END 
)
*6371) AS foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...