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
我将以下 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