获取给定邮政编码20英里半径内的所有邮政编码(地址)的SQL查询

获取给定邮政编码20英里半径内的所有邮政编码(地址)的SQL查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的查询只匹配彼此相等的邮政编码。我需要一个查询,可以返回20英里半径内的所有邮政编码到给定的邮政编码 DECLARE @cZip VARCHAR(5) SET @cZip = '63026' DECLARE @dMin DECIMAL = 20 * 32186.9 -- metres DECLARE @c GEOGRAPHY SELECT @c = GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR)+ ' ' + CAST(l

我的查询只匹配彼此相等的邮政编码。我需要一个查询,可以返回20英里半径内的所有邮政编码到给定的邮政编码

DECLARE @cZip VARCHAR(5)
SET @cZip = '63026'
DECLARE @dMin DECIMAL = 20 * 32186.9 -- metres

DECLARE @c GEOGRAPHY
SELECT @c = GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR)+ ' '     + CAST(latitude AS VARCHAR) + ')')
FROM wcr_sales_zip_info.dbo.utT_ZIP_Long_Lat
WHERE ZIP_CD = @cZip

SELECT  S.ZIP_CD
    ,AAE.AGN_FIRST_NM
    ,AAE.AGN_LAST_NM
    ,AAE.AGN_ADDRESS_CD
    ,AAE.AGN_CITY_CD
    ,AAE.AGN_STATE_CD
    ,AAE.AGN_ZIP_CD
    ,AAE.AGN_AGENT_NBR
    ,AAE.AGN_EMAIL_NBR
    ,AC.CANDIDATE_ID
    ,AC.FIRST_NM
    ,AC.LAST_NM
    ,AC.ADDRESS_TXT
    ,AC.CITY
    ,AC.STATE_CD
    ,AC.ZIP AS 'ZIP1'                   
    ,STUFF(STUFF(STUFF(AC.HOME_PHONE_NBR,1,0,'  ('),6,0,') '),11,0,'-') AS 'HOME_PHONE_NBR' 
    ,STUFF(STUFF(STUFF(AC.ALT_PHONE_NBR,1,0,' ('),6,0,') '),11,0,'-') AS 'ALT_PHONE_NBR'
    ,AC.EMAIL
    ,AC.PREF_CONTACT_METHOD_CD
    ,AC.TRAVEL_TIME_MINS_NBR
    ,AC.TRAVEL_DISTANCE_MLS_NBR
    ,AC.ADDED_DT    
FROM wcr_sales_zip_info.dbo.utT_ZIP_Long_Lat S
JOIN ASRD_AGENT_AUTO_EMAIL AAE ON S.ZIP_CD = AAE.AGN_ZIP_CD
JOIN ASRD_CANDIDATES AC ON S.ZIP_CD = AC.ZIP
WHERE --AAE.AGN_ZIP_CD >= '63026'
--AND 
@c.STDistance(GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR)  + ' ' + CAST(latitude AS VARCHAR) + ')')) >= @dMin 
AND AC.ADDED_DT >= DATEADD(day, -7, GETDATE())  

由于计算的复杂性,我使用UDF

在这里,您将通过基本Lat/Lng以及待测试的Lat/Lng

要清楚:距离是“乌鸦飞”的距离,而不是行驶距离

例如:

Declare @BaseZip  varchar(10) = '02806'
Declare @Within   int         = 20

Select Distinct
       BaseZip = A.ZipCode
      ,B.ZipCode
      ,B.CityName
      ,B.StateCode
      ,Miles = [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng)
 From (Select Distinct ZipCode,Lat,Lng From [dbo].[ZipCodes] where ZipCode=@BaseZip) A
 Join [dbo].[ZipCodes] B
   on [dbo].[udf-Geo-Calc-Miles] (A.Lat,A.Lng,B.Lat,B.Lng) <= @Within
 Order By 5 
编辑


您可能会注意到一些重复/相同的英里数。您可能知道,城市可能有其他名称,例如布朗大学和布朗车站位于普罗维登斯,国际扶轮,但组织也可能有自己的邮政编码。

这不是一个解决方案,但它可能会为您指明正确的方向。轻微的迂回…在扮演varchar时要小心。您没有指定长度,它将使用默认值。你知道默认值是多少吗?你知道长度可以根据使用情况而改变吗?你知道它在下一个版本中可能会改变吗?始终指定varchar长度,并避免代码出现一些潜在的严重问题。swish!太好了,干得好@史泰洛克:谢谢你的笑容:)
DECLARE @cZip VARCHAR(5)
SET @cZip = '63026'
DECLARE @dMin DECIMAL = 20 * 32186.9 -- metres

DECLARE @c GEOGRAPHY
SELECT @c = GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR)+ ' '     + CAST(latitude AS VARCHAR) + ')')
FROM wcr_sales_zip_info.dbo.utT_ZIP_Long_Lat
WHERE ZIP_CD = @cZip

SELECT  S.ZIP_CD
    ,AAE.AGN_FIRST_NM
    ,AAE.AGN_LAST_NM
    ,AAE.AGN_ADDRESS_CD
    ,AAE.AGN_CITY_CD
    ,AAE.AGN_STATE_CD
    ,AAE.AGN_ZIP_CD
    ,AAE.AGN_AGENT_NBR
    ,AAE.AGN_EMAIL_NBR
    ,AC.CANDIDATE_ID
    ,AC.FIRST_NM
    ,AC.LAST_NM
    ,AC.ADDRESS_TXT
    ,AC.CITY
    ,AC.STATE_CD
    ,AC.ZIP AS 'ZIP1'                   
    ,STUFF(STUFF(STUFF(AC.HOME_PHONE_NBR,1,0,'  ('),6,0,') '),11,0,'-') AS 'HOME_PHONE_NBR' 
    ,STUFF(STUFF(STUFF(AC.ALT_PHONE_NBR,1,0,' ('),6,0,') '),11,0,'-') AS 'ALT_PHONE_NBR'
    ,AC.EMAIL
    ,AC.PREF_CONTACT_METHOD_CD
    ,AC.TRAVEL_TIME_MINS_NBR
    ,AC.TRAVEL_DISTANCE_MLS_NBR
    ,AC.ADDED_DT    
FROM wcr_sales_zip_info.dbo.utT_ZIP_Long_Lat S
JOIN ASRD_AGENT_AUTO_EMAIL AAE ON S.ZIP_CD = AAE.AGN_ZIP_CD
JOIN ASRD_CANDIDATES AC ON S.ZIP_CD = AC.ZIP
WHERE --AAE.AGN_ZIP_CD >= '63026'
--AND 
@c.STDistance(GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR)  + ' ' + CAST(latitude AS VARCHAR) + ')')) >= @dMin 
AND AC.ADDED_DT >= DATEADD(day, -7, GETDATE())