Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

tìm vị trí gần nhất trong ms-sql

Sử dụng chức năng này

CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT)
RETURNS FLOAT 
AS
BEGIN

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371
END

Bạn có thể sắp xếp theo chức năng này, NHƯNG trên các tập dữ liệu lớn, tốc độ sẽ rất chậm, vì vậy hãy cố gắng lọc trước tập bản ghi

CẬP NHẬT:

Sử dụng dữ liệu thử nghiệm của @ chopikadze:

declare @lat float, @lng float
select @lat = 41.0186, @lng = 28.964701

declare @Location table(Latitude float, Longtitude float, Name nvarchar(50))
insert into @Location(Latitude, Longtitude, Name) values (41.0200500000, 40.5234490000, 'a')
insert into @Location(Latitude, Longtitude, Name) values (41.0185714000, 37.0975924000, 'b')
insert into @Location(Latitude, Longtitude, Name) values (41.0184913000, 34.0373739000, 'c')
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 39.5833333000, 'd')
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 28.9333333000, 'e')

SELECT ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) DistanceKm, * FROM @Location
ORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude))

Giả sử rằng Trái đất KHÔNG phải là một geoid, mà là một quả bóng tròn, nếu bạn cần công thức chính xác dưới 1m - Tôi có thể tìm thấy nó, không mang theo nó với tôi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiểu văn bản SQL Server so với kiểu dữ liệu varchar

  2. Tìm các hàng đã thay đổi (khóa tổng hợp có rỗng)

  3. Kết nối với cơ sở dữ liệu SQL Server cục bộ bằng C #

  4. Cột thay thế trong SQL Server

  5. Cách bắt đầu công việc tác nhân SQL Server tự động