1

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をプラグインしようとしましたが、無効なオブジェクト名であると表示されます。ポインタやヒントはありますか?...

4

4 に答える 4

2

私は自分の利益のためにデータ型を使用するのが好きです:

select 115949833 / 1000000.0
-- returns 115.949833000

その後、仕様に丸め/切り捨てることができます。

除数に小数点を追加すると、この操作の出力がデータ型numericの優先順位の規則に従って昇格します。

アップデート

テストデータごとに、次のようなクエリを使用できます。

select cast(Latitude / 1000000.0 as decimal(10, 6)) as Latitude
  , cast(Longitude / 1000000.0 as decimal(10, 6)) as Longitude
from MyTable

/*
Returns:
Latitude    Longitude
36.158500   115.949833
36.340000   115.914667
36.153488   115.944875
*/
于 2013-02-01T19:53:16.290 に答える
1

常に3番目の文字の後にドットを追加したいですか?STUFF関数を使用する

DECLARE @v VARCHAR(100)
SELECT @v = '115949833'

SELECT CONVERT(FLOAT,(STUFF(@v,4,0,'.')))

出力

115.949833

別の方法は、0.000001を掛けることです

DECLARE @v VARCHAR(100)
SELECT @v = '115949833'


SELECT CONVERT(INT,@v)  * 0.000001
于 2013-02-01T19:51:09.320 に答える
0

私は使用しますSTUFF

select stuff(longitude,4,0,'.') from table

これがフィドルです。

フロートにする必要がある場合は、キャストを追加するだけです。

select cast(stuff(longitude,4,0,'.') as float)  from table

幸運を。

于 2013-02-01T19:52:22.303 に答える
0
SELECT round(substring(longitude,1,3)+'.'+substring(longitude,4,6),6)
FROM TableName
于 2013-02-01T20:08:11.437 に答える