2016-08-03 12 views
0

Я использовал следующий sql для mySQL, но теперь мне нужно использовать это для базы данных Firebird. Я искал и читал документацию Firebird, но не мог найти альтернативы. В радианах Firebird и «пределе» оба не поддерживаются. Кто-нибудь успешно сделал подобное в Firebird?Формула Хаверсина в базе данных Firebird

SELECT zip, (3959 * acos(cos(radians(38.6285426)) * cos(radians(lat)) 
* cos(radians(lng) - radians(-86.05296039999999)) + sin(radians(38.6285426)) * sin(radians(lat)))) AS distance 
FROM zipcodes 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20; 

ответ

0

Для любого, имеющего подобную проблему, здесь было мое решение для Firebird, который возвращает все молниями коды в определенном радиусе мили от Lat/Long (Great Circle) в один запрос.

select zipcode from(
SELECT zipcode, (3959 * acos(cos(38.6285426/57.2958) * cos(lat/57.2958) 
* cos(lon/57.2958 - -86.05296039999999/57.2958) + sin(38.6285426/57.2958) * sin(lat/57.2958))) AS distance 
FROM zip_codes) 
where distance < 20 
ORDER BY distance 
4

radians функция в MYSQL «возвращает аргумент X, преобразованный из градусов в радианы». Для этого вам не нужна встроенная функция, это довольно простая математика: radians = degrees × π/180º. Вы можете создать представление удобства с расчетными столбцами для преобразования deg-to-rad, чтобы упростить чтение запроса. BTW, Firebird имеет builtin function for retrieving π value.

Вместо LIMIT Firebird supports ROWS syntax:

SELECT <columns> FROM ... 
    [WHERE ...] 
    [ORDER BY ...] 
    ROWS <m> [TO <n>] 
+0

Хотя я полностью ценю ваш ответ, я, вероятно, должен был подробно рассказать о своем вопросе. Да, я понимаю математику и да, это простая математика. mySQL возвращает все мои zipcodes в пределах 25 миль с помощью одного простого запроса. Мой вопрос, наверное, должен был состоять в том, что у firebird нет аналогичного варианта, без необходимости делать некоторые дополнительные дополнительные функции и вычисления и делать вещи более сложными, чем они должны быть, чтобы получить тот же результат. –

+0

IMO, создающая представление, которое имеет 'lat' и' lng' в качестве радианов, довольно простое и делает окончательный запрос более приятным (вместо 'radians (nn.mmm)' у вас есть только 'lat' или' lng'). Но вы также можете создать UDF для функции radians, если вы предпочитаете это ... но вы не можете использовать MySQL-запрос, как в Firebird, no. – ain

+0

Sidenote: Если вы используете Firebird 3, вы также можете создать UDF, не создавая собственную библиотеку для предоставления функции. –

 Смежные вопросы

  • Нет связанных вопросов^_^