Microsoft SQL Server ManagementStudio2008でSQLを使用しています。
一言で言えば、私は座標に関するデータを受け取っていますが、緯度と経度の座標間のマイレージを計算できる必要があるため、115949833
として出力する必要があります。115.949833
経度と緯度の両方の値は、小数点以下の桁数のない整数として保存されます。サブストリングを使用して連結し、浮動小数点に変換できるように、文字列に変更しようとしていました。lat値とlong値の間のマイレージの式はすでに理解していますが、小数点の問題があるため正確ではありません。
経度に使用したコードは次のとおりです。
Cast(substring(str(longitude,1,not null),1,3)+'.'+substring(str(longitude,4,not null),4,9) as float) as longitude
の近くに間違った構文があると言われ続けますCAST
。
私は多くの調査を行ってきましたが、それでもこのタスクを実行する正確な方法を見つけることができませんでした。誰かがフィードバック、ヒント、ヘルプなどを提供できれば。それは大いにありがたいです。ありがとう。
***編集:「経度」という名前の列全体を浮動小数点に変換するか、何らかの方法で3番目の文字の後に小数を表示し、「緯度」という名前の列全体を2番目の文字の後に小数を表示する必要があります。
たとえば、今のところ私の列は次のように表示されます。
緯度経度
3615850011594983336340000 115914667
36153488
115944875
そして私はそれがこのように見える必要があります:
緯度経度
36.158500115.94983336.340000 115.914667
36.153488
115.944875
*編集* TimLehnerの回答を使用して、コードを使用して彼の回答を実装しましたが、新しい緯度と経度の列を使用してマイレージを表示する方法を理解する必要があります...いくつかの臨時雇用者を作成しましたテーブルは、特定のradio_nameに基づいて必要な情報を格納しますが、TimのAnswerを使用してそれらの一時テーブルから情報を取得することはできません。
私が使用しているコードは次のとおりです
。USE
[system]
GOWith
CTE as
(SELECT * FROM AVL
WHERE(DATE_TIME between '01 / 30/2013 00:00:00'AND
'01/30/2013 23:59:59' )AND radio_name ='MAS7')
CTE2 as
(select *、row_number()over(partition by Vehicle_ID order by Date_Time)as RN FROM CTE)
SELECT *, sqrt((69.1*(previous.Latitude - next.Latitude))*
(69.1*(previous.Latitude-next.Latitude)) +
(69.1*(previous.Longitude-next.Longitude)) *
cos(next.Latitude/57.3) * (69.1*(previous.longitude-next.Longitude)) *
cos(next.Latitude/57.3)) as Miles
From CTE2 as Previous
Join CTE2 as Next
On previous.Vehicle_ID = Next.Vehicle_ID
AND Previous.RN =
Next.RN - 1
SELECT CAST(Latitude / 1000000.0 as decimal(10, 6)) as Latitude,
cast(Longitude / 1000000.0 as decimal(10, 6)) as Longitude
from AVL
実際のコード自体は正しく機能しますが、マイレージの計算では、元の緯度/経度の数値が使用され、小数点付きの更新された数値は使用されません。
最後のステートメントでAVLの代わりにCTE2をプラグインしようとしましたが、無効なオブジェクト名であると表示されます。ポインタやヒントはありますか?...