1. 程式人生 > >史上最全的使用Mysql計算兩點之間的距離保留後面小數點的問題

史上最全的使用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