0

我将以下 sql 用于 mySQL,但我现在需要将其用于 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;
4

2 回答 2

4

mySQL 中的radians函数“返回参数 X,从度数转换为弧度”。你不需要内置函数来做到这一点,这是相当简单的数学:radians = degrees × π / 180º. 您可以创建一个方便的视图,其中包含用于度到弧度转换的计算列,以使查询更易于阅读。顺便说一句,Firebird 具有检索 π 值的内置函数

而不是LIMITFirebird支持ROWS语法

SELECT <columns> FROM ...
   [WHERE ...]
   [ORDER BY ...]
   ROWS <m> [TO <n>]
于 2016-08-03T05:43:33.137 回答
1

对于任何有类似问题的人,这是我的 Firebird 解决方案,它在一个查询中返回纬度/经度(大圆)一定英里半径内的所有邮政编码。

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 
于 2016-08-04T02:44:51.460 回答