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;
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. –
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
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. –