PostgreSQL: ¿Qué Tipo de datos debe usarse para la Moneda?


Parece que Money el tipo se desaconseja como se describe aquí

Mi aplicación necesita almacenar moneda, ¿qué tipo de datos debo usar? ¿Numérico, dinero o FLOTADOR?

Author: a_horse_with_no_name, 2013-03-31

5 answers

Numérico con precisión forzada de 2 unidades. Nunca use float o float like datatype para representar la moneda porque si lo hace, la gente no estará contenta cuando la cifra final del informe financiero sea incorrecta por + o-unos pocos dólares.

El tipo de dinero solo se deja por razones históricas por lo que puedo decir.

 65
Author: Chris Farmiloe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 19:29:14

Su fuente no es de ninguna manera oficial. Data de 2011 y ni siquiera reconozco a los autores. Si el tipo de dinero se "desaconseja" PostgreSQL lo diría en el manual - que no lo hace.

Para una fuente más oficial , lee este hilo en pgsql-general (¡desde esta misma semana!) , con declaraciones de desarrolladores principales incluyendo D'Arcy J. M. Cain (autor original de the money type) y Tom Lane:

Básicamente, money tiene su (limitado) utilizar. La ventaja sobre numeric es rendimiento.

decimal es solo un alias para numeric en Postgres.

Respuesta relacionada (y comentarios!) acerca de las mejoras en las versiones recientes:

Personalmente, me gusta almacenar moneda como integer que representa Centavos. Eso es más eficiente que cualquier otra de las opciones mencionadas.

 77
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:09:57

Sus opciones son:

  1. integer : almacene la cantidad en centavos. Esto es lo que usan las transacciones EFTPOS.
  2. decimal(12,2): almacene la cantidad con exactamente dos decimales. Esto es lo que usa la mayoría de los programas de contabilidad general.
  3. float: idea terrible-exactitud inadecuada. Esto es lo que usan los desarrolladores ingenuos.

La opción 2 es la más común y la más fácil de trabajar. Haga que la precisión (12 en mi ejemplo, lo que significa 12 dígitos en total) sea tan grande o pequeña como funcione mejor para usted.

Tenga en cuenta que si está agregando varias transacciones que fueron el resultado de un cálculo (por ejemplo, que involucran un tipo de cambio) en un solo valor que tiene significado comercial, la precisión debe ser mayor para proporcionar un valor macro preciso; considere usar algo como decimal(18, 8) para que la suma sea precisa y los valores individuales se puedan redondear a la precisión de centavo para mostrar.

 42
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-23 19:15:03

Mantengo todos mis campos monetarios como:

numeric(15,6)

Parece excesivo tener tantos decimales, pero si existe la más mínima posibilidad de que tenga que lidiar con varias monedas, necesitará tanta precisión para convertir. No importa lo que estoy presentando a un usuario, siempre almaceno en dólares estadounidenses. De esa manera puedo convertir fácilmente a cualquier otra moneda, dada la tasa de conversión para el día en cuestión.

Si nunca haces nada más que una moneda, la peor la cosa aquí es que desperdiciaste un poco de espacio para almacenar algunos ceros.

 12
Author: Michael Collette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 18:52:47

Después de una amplia experiencia en muchas aplicaciones, lo que recomiendo es bigint, que es un entero de 64 bits que almacena valores en micro-dólares (o moneda importante similar).

Micro = 1 millonésima, por lo que 1 micro-dólar es $1 / 1,000,000. Esto proporciona una granularidad muy fina que puede manejar casi cualquier fracción de un centavo.

  • 64 los enteros de bits son pequeños, fáciles de almacenar, fáciles de manejar, compatibles con todo y evitan la pérdida de datos en los cálculos.

  • Funciona especialmente bien para precios pequeños por unidad, como impresiones de campañas publicitarias o cargos de API.

  • Fácil de mantener la precisión a través de todos los cálculos y (como mejor práctica) aplicar el redondeo en la salida final (como la creación de una factura).

 0
Author: Mani Gandham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-11 06:09:14