2012-08-29 17 views
1

是否有任何將度數/分鐘/秒(保存在A列中)轉換爲小數(將保存在新列B中)的SQL腳本?我搜索了現有的解決方案,但所有示例都參考了小數點 - >度/分/秒。我很欣賞任何示例,因爲我在SQL腳本中不夠強大。使用SQL將度/分/秒轉換爲小數

+1

等待,怎麼都保存在_one_列的三個值?大概這是一個**數學**問題,而不是一個SQL問題。 –

+0

@ X-Zero:不幸的是,它們被保存在一列中,例如, 41.182973。如果度,分和秒會保存在不同的列中,那麼我可以簡單地將分鐘除以60和3600秒。 – Gusgus

+1

41.182973度/分鐘/秒是怎樣的?這就是我期望的十進制。 – stark

回答

3

以下似乎工作:

SELECT DMS, DEGREES + (MINUTES/60) + (SECONDS/(60 * 60)) AS DECIMAL_DEGREES 
    FROM (SELECT DMS, 
       TRUNC(DMS) AS DEGREES, 
       TRUNC((DMS - TRUNC(DMS)) * 100) AS MINUTES, 
       ((DMS * 100) - TRUNC(DMS * 100)) * 100 AS SECONDS 
      FROM TEST_DMS) 

,或者,如果你喜歡把它們當作一個表達式:

SELECT DMS, 
     TRUNC(DMS) + 
     (TRUNC((DMS - TRUNC(DMS)) * 100)/60) + 
     (((DMS * 100) - TRUNC(DMS * 100)) * 100)/(60 * 60) AS DECIMAL_DEGREES 
    FROM TEST_DMS 

至少,這些與我的信賴,生鏽的返回結果一致HP-41C。 :-)

分享和享受。

0

我工作的一個項目...我用腳本在DMS轉換解決問題上的Oracle數據庫

SELECT 
CASE 
WHEN LENGTH(longitude)=7 THEN ROUND (cast(substr(longitude, 1, 1) as numeric(10,5)) + cast(substr(longitude, 3, 2) as numeric(10,5))/60 + cast(substr(longitude, 6, 2) as numeric(10,5))/3600,4) 
WHEN LENGTH(longitude)=8 THEN ROUND (cast(substr(longitude, 1, 2) as numeric(10,5)) + cast(substr(longitude, 4, 2) as numeric(10,5))/60 + cast(substr(longitude, 7, 2) as numeric(10,5))/3600,4) 
ELSE 
ROUND (CAST (longitude as Numeric(10,5)),4) 
END AS LONGITUDE, 
CASE 
WHEN LENGTH(latitude)=7 THEN ROUND (cast(substr(latitude, 1, 1) as numeric(10,5)) + cast(substr(latitude, 3, 2) as numeric(10,5))/60 + cast(substr(latitude, 6, 2) as numeric(10,5))/3600,4) 
WHEN LENGTH(latitude)=8 THEN ROUND (cast(substr(latitude, 1, 2) as numeric(10,5)) + cast(substr(latitude, 4, 2) as numeric(10,5))/60 + cast(substr(latitude, 7, 2) as numeric(10,5))/3600,4) 
ELSE 
ROUND (CAST (latitude as Numeric(10,5)),4) 
END AS LATITUDE 
相關問題