史上最全的使用Mysql計算兩點之間的距離保留後面小數點的問題
在Mysql裡計算兩點之間的距離一般我們使用的sql如下:
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000
這時需要宣告一個函式接收計算出的距離,比如distance,所以現在的語句變成這樣:
ROUND(
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000
) AS distance
在這裡需要重點說明一下ROUND這個函式,round函式用於資料的四捨五入,它有兩種形式:
1、round(x,d) ,x指要處理的數,d是指保留幾位小數
這裡有個值得注意的地方是,d可以是負數,這時是指定小數點左邊的d位整數位為0,同時小數位均為0;
2、round(x) ,其實就是round(x,0),也就是預設d為0;
所以現在我們只需要在這段sql的計算結果後面加上要定義取得小數位就行,語句如下
ROUND(
6378.140 * 2 * ASIN(
SQRT(
POW(
SIN(
(
39.904989 * PI() / 180 - 表名.lat * PI() / 180
) / 2
),
2
) + COS(39.904989 * PI() / 180) * COS(表名.lat * PI() / 180) * POW(
SIN(
(
116.405285 * PI() / 180 - 表名.lng * PI() / 180
) / 2
),
2
)
)
) * 1000,此處就是要定義的小數點位
) AS distance