2010-02-19 4 views
1

groupe,Reliure 2D Boîte de requête

J'ai colonnes de table ProductID, latitude,longitude,timestampGMT et la recherche d'une requête pour compter le nombre de numéros d'identification sont dans ce cadre de sélection ou enveloppe.

Des suggestions utiles.

+3

Je ne pense pas avoir jamais dit cela, mais ce sujet ne devrait pas être un wiki. –

+1

D'accord, ce n'est pas ** un sujet wiki. – casperOne

+0

MS Server 2003 R2 n'existe pas. Et qu'est-ce qu'une recherche de lieu en radians? – VladV

Répondre

3

SQL Server 2008 prend en charge GEOGRAPHY type de données.

Vous devez stocker lat, lon dans une seule colonne de ce type de données, créer un index SPATIAL dessus et l'utiliser dans une requête:

SELECT m.* 
FROM mytable 
ON  coords.STDistance(@mypoint) <= @mydistance 
+0

Chad travaille sur 2003, qui n'a pas d'index spatial. –

+1

@Byron: il semble que j'ai raté la version de 'SQL Server 2003' :) – Quassnoi

+0

ouais. Moi aussi. :) Je voulais dire 2005, mais maintenant que j'ai lu la question, il utilisait Windows Server 2003 et n'a jamais mentionné son numéro de version SQL. –

1

Cette question ne devrait pas être un wiki communautaire. Changez si vous le pouvez. De toute façon, voici votre réponse.

@Quassnoi a donné une excellente solution pour SQL 2008, mais vous demandez 2003, n'est-ce pas? 2003 n'a pas le même support géographique que 2008. Vous devrez rouler le vôtre comme je l'ai fait. Ce n'est pas difficile, selon le niveau de précision dont vous avez besoin. Voici une fonction scalaire que je suis venu avec la base d'une formule populaire pour calculer la distance entre deux ensembles de coordonnées:

-- ===================================================================== 
-- Author:  Byron Sommardahl 
-- Create date: June 15, 2007 
-- Description: Calculates the distance between two sets of coordinates. 
-- ====================================================================== 
CREATE FUNCTION [dbo].[Distance] 
(
@lat1 float, 
@long1 float, 
@lat2 float, 
@long2 float 
) 
RETURNS float 
AS 
BEGIN 

RETURN (3958*3.1415926*sqrt((@[email protected])*(@[email protected]) + cos(@lat2/57.29578)*cos(@lat1/57.29578)*(@[email protected])*(@[email protected]))/180); 
END 
GO 

Pour l'utiliser, nourrir juste dans vos coords en utilisant SELECT:

SELECT dbo.Distance(MyPlace.Lat, MyPlace.Long, TheirPlace.Lat, TheirPlace.Long); 

Ensuite, vous pouvez simplement vérifier si un produit est dans un certain rayon de votre point focal. Pas exactement la boîte de délimitation, mais il vous permet d'aller dans la bonne direction.

+0

Il n'y a pas SQL Server 2003 – Chris

+0

@Chris: Mon erreur. Je voulais dire 2005. Obtenir mes numéros de version mélangés à coup sûr! –