PostgreSQL数据库中的货币转换和聚合

时间:2009-10-30 22:49:02

标签: ruby postgresql

在我们的申请中,我们存储了他们以各自的货币插入的不同捐赠者的多个项目资金,例如德国为欧元,瑞典为瑞典克朗等。

我们的想法是以一种货币提供这些项目的报告。 我们目前将资金数额与货币一起存储在如下表格中:

development=> \d funding_forecasts
                                   Table "public.funding_forecasts"
   Column    |          Type          |                           Modifiers                            
-------------+------------------------+----------------------------------------------------------------
 id          | integer                | not null default nextval('funding_forecasts_id_seq'::regclass)
 project_id  | integer                | 
 year        | integer                | 
 currency    | character varying(255) | 
 payments    | integer                | 
 commitments | integer                | 

我们还有一个exchange_rates表,用于存储每年从基础货币到特定货币的汇率。

现在的问题是,当我们创建报告时,我们需要查询每个项目的大量资金表,因此在应用程序端有大量的查询和大量的货币转换和聚合。

我觉得很酷,因为Rails对自定义SQL不太灵活(我知道它可以但很麻烦)是或多或少透明地进行转换,也许使用自定义数据类型可以轻松实现聚合(使用sum和+/-等运算符).. 无论如何我完全不确定这一点,所以非常感谢所有评论!

3 个答案:

答案 0 :(得分:1)

您是否看过Martijn van Oosterhout的tagged types内容?

http://svana.org/kleptog/pgsql/taggedtypes.html

答案 1 :(得分:0)

以前没有多次使用货币转换,随着时间的推移汇率开支和执行所有计算似乎要花费很多。

在我看来,更好的解决方案可能是将钱存入单一货币,这取决于货币转换成货币的那一天。因此,如果捐款人A以SEK结账,但您的组织以欧元运作,则将支票带到银行,然后将其兑换为欧元。我会以欧元输入银行给我的金额。

我知道这个解决方案不适用于未来捐款的承诺。是否有可能要求每个人用同一种货币捐款?

答案 2 :(得分:0)

我认为您应该为表添加另一列 - payments_in_usd。当捐赠者支付时,将捐款的货币和支付金额根据支付时间的汇率保存。对于未来的承诺,您不知道美元的金额是多少,但您可以轻松地将当前汇率用于当前的承诺价值。

要查看您希望以美元支付的费用,请使用:

select sum(commitments*current_exchange_rate(currency))

当你想知道支付多少时,只需:

select sum(payments_in_usd)