Firebird 数据库上的 Haversine 公式

Haversine formula on a Firebird database

我将以下 sql 用于 mySQL,但我现在需要将其用于 Firebird 数据库。我已经搜索并阅读了 Firebird 文档,但似乎无法找到替代方案。在 Firebird 中,'radians' 和 'limit' 均不受支持。有没有人在 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;

mySQL"returns the argument X, converted from degrees to radians"中的radians函数。您不需要内置函数来执行此操作,这是相当简单的数学运算:radians = degrees × π / 180º。您可以创建一个方便的视图,其中包含用于 deg-to-rad 转换的计算列,以使查询更易于阅读。顺便说一句,Firebird 有 builtin function for retrieving π value.

而不是 LIMIT 火鸟 supports ROWS syntax

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

对于遇到类似问题的任何人,这是我针对 Firebird 的解决方案,即 returns 在一次查询中 Lat/long(大圆圈)一定英里半径内的所有邮政编码。

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