9

このコードには奇妙な問題があります。以下に示すように実行すると、エラーが発生します。

無効な浮動小数点演算が発生しました。

しかし、パラメータ@Longitudeを-98.508730に変更すると最後の桁のみが変更されていることに注意してください) 、コードは問題なく機能します。

このコードは@MilesRadius、LatLngポイント周辺のプロパティを一覧表示することになっています。
@Latitudeおよび@Longitudeパラメータは、テーブルAddressのlongitudeおよびlatitudeフィールドと同じタイプです。

ここで何ができますか?ありがとう。

DECLARE @Latitude decimal (10,6);
DECLARE @Longitude decimal (10,6);
DECLARE @MilesRadius int;
SET @Latitude = 29.607654
SET @Longitude = -98.508731
SET @MilesRadius  = 5

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           ((3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))))) as distance
FROM       Shared.Address ADR
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           (3959 * acos(cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude)))) < @MilesRadius                       
ORDER BY distance
4

1 に答える 1

11

ドメインエラーを返す使用している唯一の関数はACOS、入力が範囲内にない場合に発生する-1 to +1ため、この場合をいじることができます(中間式は1.000000000001丸め誤差によるものと想定しています)

SELECT     ADR.LineOne as address, 
           ADR.City as city,           
           ADR.Latitude as latitude,
           ADR.Longitude as longitude, 
           distance
FROM       Shared.Address ADR
CROSS APPLY (SELECT cos(radians(@Latitude)) * cos(radians(ADR.Latitude)) * cos(radians(ADR.Longitude) - radians(@Longitude)) + sin(radians(@Latitude)) * sin(radians(ADR.Latitude))) T(ACosInput)
CROSS APPLY (SELECT ((3959 * acos(CASE WHEN ABS(ACosInput) > 1 THEN SIGN(ACosInput)*1 ELSE ACosInput END)))) T2(distance)
WHERE      ADR.Latitude IS NOT NULL AND 
           ADR.Longitude IS NOT NULL AND 
           distance < @MilesRadius                       
ORDER BY distance
于 2012-01-12T15:38:09.023 に答える