获取距离特定邮政编码50英里的所有邮政编码

时间:2013-03-11 01:10:49

标签: sql sql-server distance latitude-longitude

我有一个页面,用户可以在其中插入邮政编码,并会在代码附近返回所有邮政编码。

现在我有这张桌子

CREATE TABLE [dbo].[zip](
    [zipcode] [varchar](5) NOT NULL,
    [state] [varchar](2) NULL,
    [city] [varchar](50) NULL,
    [longitude] [float] NULL,
    [latitude] [float] NULL,        
    [CreateStamp] [smalldatetime] NULL,
    [state_name] [varchar](50) NULL,        
)

如果你能给我一个完整的指示,我不知道如何做到这一点

结果将是用户插入他们的邮政编码,然后查询将返回他们自己的邮政编码50英里内的所有邮政编码。

1 个答案:

答案 0 :(得分:0)

如果您正在使用SQL Server 2008及更高版本,则可以使用GEOGRAPHY数据类型。 首先,您需要根据其邮政编码获取中心的Geography位置,然后选择指定距离内的所有记录。要计算距离,请使用STDistance方法。 这是一个例子:

DECLARE @cZip VARCHAR(5)
SET @cZip = '<center zip code>'
DECLARE @dMin DECIMAL = 50 * 1609.344 -- metres

DECLARE @c GEOGRAPHY
SELECT @c = GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR) + ' ' + CAST(latitude AS VARCHAR) + ')')
FROM zip
WHERE zipcode = @cZip

SELECT * 
FROM zip 
WHERE @c.STDistance(GEOGRAPHY::Parse('Point(' + CAST(longitude AS VARCHAR) + ' ' + CAST(latitude AS VARCHAR) + ')')) <= @dMin