iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 30
3
500 Miles 是一首老歌.筆者以前在鳳山受訓時打夜間教練時,曾經望著遠處的燈光,
想起了這首歌.時光匆匆已過數十寒暑,現在用 youtube 就可以聽以前蠻多老歌的,
一邊聽,一邊想著把 500 Miles,換算成公里. 我的 Postgresql 陪著我聽歌,
也幫我換算出來了.

https://ithelp.ithome.com.tw/upload/images/20191015/20050647jytKA1AT9W.png

數與量是不同的,量是有單位的.不同單位間的換算在我們發展系統時,若有一個標準的套件,
就比較能確保穩定性.關於單位有國際標準的,請參考以下鏈結

https://en.wikipedia.org/wiki/International_System_of_Units

https://en.wikipedia.org/wiki/Binary_prefix

幸運的是 Unix 有發展出轉換工具,後續 GNU版本也有持續發展,

https://www.gnu.org/software/units/

Mac 可以透過 brew install gnu-units 安裝,
Windows 可以在這裡找到
http://ftp.gnu.org/gnu/units/windows/

使用互動模式
| => units
586 units, 56 prefixes
You have: 500 miles
You want: km
	* 804.672
	/ 0.0012427424

--
但若是大量的資料,能在資料庫內處理,就更理想了.
在 Postgresql 有這個 extension

https://github.com/df7cb/postgresql-unit

作者在 Debian 也有貢獻.
我們下載之後, unzip, make, make install

create extension unit;

這樣就安裝好了.

接下來測試看看

select '800 m'::unit + '500 m' as length;

+--------+
| length |
+--------+
| 1.3 km |
+--------+

select '1441 min'::unit as "1441 minutes";

+------------------+
|   1441 minutes   |
+------------------+
| 1 d + 00:01:00 s |
+------------------+

select '3 | 4 min'::unit as "3/4 minutes";

+-------------+
| 3/4 minutes |
+-------------+
| 45 s        |
+-------------+

select '128 km/h'::unit as "speed";

+----------------------+
|        speed         |
+----------------------+
| 35.5555555555556 m/s |
+----------------------+

set unit.byte_output_iec = on;

select '4 TB'::unit as disk_sold_as_4tb;

+----------------------+
|   disk_sold_as_4tb   |
+----------------------+
| 3.63797880709171 TiB |
+----------------------+

select '1 GiB'::unit @ 'MiB'; 

+----------+
| ?column? |
+----------+
| 1024 MiB |
+----------+

select '2 MB/min'::unit @ 'GB/d' as netspd1
     , '2 MiB/min'::unit @ 'GiB/d' as netspd2;

+-----------+--------------+
|  netspd1  |   netspd2    |
+-----------+--------------+
| 2.88 GB/d | 2.8125 GiB/d |
+-----------+--------------+



select '500 mi'::unit as "500 Miles";

+------------+
| 500 Miles  |
+------------+
| 804.672 km |
+------------+

這個套件還有許多強大的功能,等你來嘗試.

-----
轉眼已到30天,也該做一下結尾感言了.
好像有欠一個 計算sequence 的函數,還不夠完備的.
我想能夠讀完我這系列的,應該能夠處理一個簡單的正負數判斷,
結合絕對值函數的運算.若有疑問,也別擔心,我還蠻常在 ithelp 
回答問題的.
也歡迎到 Postgresql.TW 社群.

感謝在本系列中有出場的: 我的朋友 胖達,玉面飛鷹.
被我拉來當例子出現的,搞笑談軟工的Teddy Chen.
還有 PHP 之父 Rasmus Lerdorf.
Postgresql-Unit 的 Christoph Berg.
hstore , ltree 的 Oleg Bartunov, Teodor Sigaev.
還有許多對Postgresql 有貢獻的人們.
當然也要感謝 天津風,島風,冬月還有她們的小夥伴.

本系列沒有在 index 及效能方面,有所著墨.著重在系統
內部表出發,進而探討基本的資料型態,以及一些特殊的資料
型態.今年就先介紹到此.

上一篇
Postgresql ltree 的應用
下一篇
Postgresql 使用 fdw 連接MySQL 將階層資料移轉並使用 ltree 產生路徑實例
系列文
以Postgresql為主,聊聊資料庫.31
0
暐翰
iT邦大師 1 級 ‧ 2019-10-15 13:43:37

恭喜大大完賽!
常看到大大在PG.tw、IT邦幫忙為PG推廣的身影

感謝大大無私分享.

0
石頭
iT邦研究生 3 級 ‧ 2019-10-15 14:09:07

恭喜大大完賽!

感謝石頭大大.

0
Andy Chiu
iT邦研究生 3 級 ‧ 2019-10-15 21:26:46

恭喜完賽!最近試著學習Postgresql,想用MS Access當前端,Postgresql作為後端資料庫,沒想到Postgresql這麼多功能!這系列真是精采!/images/emoticon/emoticon12.gif

謝謝,祝你學習順利愉快.

我要留言

立即登入留言