欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

使用 PostgreSQL 處理貨幣數據,你更喜歡哪種方法?

admin
2024年10月14日 8:24 本文熱度 605

我們經常需要用數據庫來處理商品交易的貨幣值,在 PostgreSQL 中,有多種不同的方法來處理貨幣數據。

貨幣數據類型

貨幣

PostgreSQL 實際上確實有一個money數據類型。但不建議使用它,因為它不處理一分錢的小數部分,并且貨幣與數據庫區域設置相關聯。雖然 money 類型不是存儲貨幣的最佳實踐,但我確實認為,當希望將查詢輸出格式化為貨幣值時,money 對于轉換數據非常方便。

浮點型

在任何使用帶小數的正數和負數的系統中,浮點數通常都很流行(因為名稱 float 意味著數字在數字小數位上浮動)。浮點型(real/float4)和雙浮點數據類型(float8)可以用來存取貨幣數據,但它們通常并不理想,因為它們基本上不精確。

例如,這是正確的:

select 0.0001::float4;

這也是正確的:

select 0.0001::float4 + 0.0001::float4;

但是,如果我們嘗試進行額外的分數運算,這并不會得到真正的預期結果:

select 0.0001::float4 + 0.0001::float4 + 0.0001::float4;

整型

很多人用integer來存儲貨幣數據。整數不支持任何類型的小數,因此 100/3 可能等于 33.3333,但在整數的數學運算中,它只會得到 33。如果您知道您的最小單位是什么(甚至低至一分錢的分數部分),并且可以在數據庫中使用乘數,這可以用于存儲貨幣數據。因此,處理整數分錢的乘數為 100,如果您想表示 0.237928372 BTC 之類的金額,則乘數為 1000000000。這個單位是整體存儲的,這解決了 float 無法表示的值的問題。這種技術仍然存在重大限制,因為integer最大只能存儲 2147483647 的數字,bigint最大只能存儲 9223372036854775807。

Integer 具有顯著的性能和存儲效率。它只是一個 4 字節大小的列,如果您使用的是bigint,則是 8 字節。另外,請記住,將貨幣存儲為整數,要以傳統格式輸出,供前端或 sql 報告表示一元、一分或十進制數字,需要除法或轉換為不同的數據類型。

數值型

numeric/decimal被廣泛認為是在 PostgreSQL 中存儲貨幣數據的理想數據類型。您可以輸入很多小數位(10,000+ 位數字!),并且可以定義精度。數值數據類型有兩個限定符,即精度和小數位,用于定義要使用的合理小數位數。創建類型時,它看起來會像NUMERIC(7,5)這樣,其中精度為 7,小數部分為 5。

  • ? 精度是小數點前后的總位數。您需要將其設置為您可能需要存儲的最高數量。所以這里 99.99999 是最大值,-99.99999 是最小值。

  • ? 小數部分是小數點后的數字數,因此這將是 5 位小數。

選擇小數部位意味著 PostgreSQL 將在某個時候對數字進行舍入。如果要防止四舍五入,請確保您的 scale 數字確實非常高。

與整數相比,數值數據類型要占用很多空間,每列行 10 個字節。因此,如果您非常關心占用空間和性能,而數值型的精度不是那么重要,那么使用 integer 可能會更好。

存儲貨幣數據

好的,我們有一個數據類型來存儲實際的美分、美元、歐元等。現在我們如何存儲貨幣?一般來說,如果您需要同時以多種貨幣存儲資金,最好將貨幣與數字本身一起存儲。如果您想要官方貨幣代碼,請參閱 ISO 4217。您可以使用自定義檢查約束來要求輸入數據僅為某些貨幣類型,比如,如果您使用的是可能看起來像美元、英鎊和歐元的貨幣值。

這是本教程中加載的內容。

CREATE TABLE products (
    sku SERIAL PRIMARY KEY,
    name VARCHAR(255),
    price NUMERIC(7,5),
    currency TEXT CHECK (currency IN ('USD''EUR''GBP'))
);

如果您正在處理多種格式的貨幣,則需要考慮很多因素。在許多情況下,在事務中會發生很多事情。假設數據庫中以 USD 為單位設置的價格,要以 GBP 顯示給用戶。您會有一個像上面一樣的設置,還有另外一個 GBP 匯率表。也許該表會通過 API 進行更新,因為貨幣價值在一天中會波動。您可能以一種貨幣設置價格,而以另一種貨幣支付價格,輸入的是購買時支付的金額。

貨幣處理函數

  • ? 平均值

四舍五入到最接近的美分

SELECT ROUND(AVG(price), 2AS truncated_average_price
FROM products;
  • ? 用 ceiling 四舍五入

求和并四舍五入到最接近的整數

SELECT CEIL(SUM(price)) AS rounded_total_price
FROM products;
  • ? 用 floor 向下舍入

求和并向下舍入到最接近的整數

SELECT FLOOR(SUM(price)) AS rounded_total_price
FROM products;
  • ? 中位數

計算中位數可能會稍微復雜一些,因為 PostgreSQL 沒有內置的中位數函數,但您可以使用窗口函數來計算它

WITH sorted_prices AS (
    SELECT price,
           ROW_NUMBER() OVER (ORDER BY price) as r,
           COUNT(*) OVER () as total_count
    FROM products
)
SELECT FLOOR(AVG(price)) AS rounded_median_price
FROM sorted_prices
WHERE r IN (total_count / 2, (total_count + 1) / 2);
  • ? 轉換到貨幣類型

如果您希望結果包含貨幣符號、逗號和點號。

SELECT CEIL(SUM(price))::money AS rounded_total_price_money
FROM products;

請注意,貨幣符號將根據您的區域設置進行顯示,用show lc_monetary;會告訴您區域是什么設置,您可以將其更新為其他貨幣。

總結

  • ? 如果您只要處理整數的美分,并且您不需要美分的小數部分,可以使用intbigint。這樣可以節省空間并提供更好的性能。將您的錢以美分存儲,并在您的輸出中轉換為小數。如果所有貨幣都是同一類型,這也確實是首選的方法。如果您經常更換貨幣并處理小數美分,請嘗試numeric

  • ? 要以分數美分為單位存儲貨幣,可以使用numeric,甚至存儲到許多許多小數點。如果您需要支持大量精度的貨幣值,這是最好的選擇,但它會有一些存儲和性能成本。

  • ? 將貨幣與實際貨幣值分開存儲,以便您可以對貨幣換算進行計算。


該文章在 2024/10/14 10:07:45 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved