If you have a database of zipcodes and their latitudes and longitudes, you can use a version of this query to get the geographically closest zipcodes:
SELECT b.zipcode, b.city, b.state, b.latitude, b.longitude,
ACOS(SIN(RADIANS(a.latitude))
* SIN(RADIANS(b.latitude)) +
COS(RADIANS(a.latitude))
* COS(RADIANS(b.latitude))
* COS(RADIANS(a.longitude - b.longitude))) as distance
FROM zipcodes.zip_to_latlong a,
zipcodes.zip_to_latlong b
WHERE a.zipcode=?
ORDER BY distance
LIMIT 20
The “distance” there is…I dunno…radians? I think the original is assuming the points are on a sphere, and converts from radians to degrees to miles using the 1.1515 statue miles per nautical mile standard.