2016-08-03 30 views
0

Ich habe die folgenden SQL für MySQL, aber ich muss jetzt dies für eine Firebird-Datenbank verwenden. Ich habe die Firebird-Dokumentation durchsucht und gelesen, kann aber keine Alternative finden. In Firebird 'Radiant' und 'Limit' werden beide nicht unterstützt. Hat jemand in Firebird erfolgreich Ähnliches gemacht?Haversine-Formel auf einer Firebird-Datenbank

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; 

Antwort

0

Für jemand ein ähnliches Problem hatte, war hier meine Lösung für Firebird, die alle Reißverschlüsse Codes innerhalb eines bestimmten Meile Radius eines Lat zurück/lang (Great Circle) in eine Abfrage.

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

Die radians Funktion in mySQL "gibt das Argument X, von Grad in Radian umgewandelt". Sie brauchen keine eingebaute Funktion, um das zu tun, es ist eher einfache Mathematik: radians = degrees × π/180º. Sie könnten eine Komfortansicht mit berechneten Spalten für die Umwandlung von Grad in Radius erstellen, um die Abfrage leichter lesbar zu machen. BTW, Firebird hat builtin function for retrieving π value.

Statt LIMIT Firebird supports ROWS syntax:

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

Während ich Ihre Antwort vollständig zu schätzen weiß, hätte ich wahrscheinlich meine Frage ein wenig mehr detailliert. Ja, ich verstehe die Mathematik und ja, es ist einfach Mathematik. mySQL gibt alle meine Postleitzahlen innerhalb von 25 Meilen mit dieser einfachen Abfrage zurück. Meine Frage, die ich hätte vermuten sollen, ist, dass Firebird keine ähnliche Option hat, ohne einige zusätzliche Funktionen und Berechnungen zu machen und die Dinge komplexer zu machen, als sie sein müssen, um das gleiche Ergebnis zu erhalten. –

+0

IMO erstellt eine Ansicht, die 'lat' und' lng' als Radiant hat, ist ziemlich einfach und macht die letzte Abfrage auch netter (anstelle von 'radians (nn.mmm)' haben Sie nur 'lat' oder' lng'). Sie könnten aber auch eine UDF für Radiant-Funktion erstellen, wenn Sie das bevorzugen ... aber Sie können die MySQL-Abfrage nicht wie in Firebird verwenden, nein. – ain

+0

Hinweis: Wenn Sie Firebird 3 verwenden, können Sie auch eine benutzerdefinierte Funktion erstellen, ohne eine systemeigene Bibliothek erstellen zu müssen, um die Funktion bereitzustellen. –