Función escalar DECIMAL o DEC

La función DECIMAL devuelve una representación decimal de un número, una representación de serie de un número o un valor de fecha y hora

Numérico a DECIMAL

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual DECIMALDEC (expresión-numérica ,precisión,escala )

Serie a DECIMAL

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual DECIMALDEC (expresión-serie ,precisión,escala,carácter-decimal )

Fecha y hora a DECIMAL

Leer el esquema de sintaxisOmitir el esquema de sintaxis visual DECIMALDEC (expresión-fecha-tiempo ,precisión,escala)

El esquema es SYSIBM.

Numérico a DECIMAL
expresión-numérica
Expresión que devuelve un valor de cualquier tipo de datos numérico incorporado.
precisión
Constante de entero con un valor en el rango 1-31. La precisión predeterminada depende del tipo de datos de la expresión de entrada:
  • 31 para coma flotante decimal (DECFLOAT)
  • 15 para coma flotante (REAL o DOUBLE) o decimal (DECIMAL)
  • 19 para entero superior (BIGINT)
  • 11 para entero grande (INTEGER)
  • 5 para entero pequeño (SMALLINT)
escala
Una constante de entero con un valor entre 0 y el valor de precisión. El valor predeterminado es cero.

El resultado es el mismo número que se generaría si el primer argumento se asignara a una columna o variable decimal con una precisión con el valor precisión y una escala con el valor escala. Los dígitos se truncan al final del número decimal si el número de dígitos a la derecha del carácter separador de decimales es superior al valor de escala. Se devuelve un error si el número de dígitos decimales significativos necesarios para representar la parte entera del número es superior al valor de precisión - escala (SQLSTATE 22003).

Serie a DECIMAL
expresión-serie
Una expresión que devuelve un valor que es una serie de caracteres o una representación de serie gráfica Unicode de un número con una longitud no superior a la longitud máxima de una constante de caracteres. El tipo de datos de expresión-serie no debe ser CLOB o DBCLOB (SQLSTATE 42884). Los espacios en blanco iniciales y finales se eliminan de la serie y la serie resultante debe ajustarse a las normas para formar una constante de entero, decimal, de coma flotante o de coma flotante decimal (SQLSTATE 22018).

La expresión-serie se convierte a la página de códigos de la sección si es necesario para que coincida con la página de códigos del carácter-decimal de la constante.

precisión
Una constante de enteros con un valor en el rango de 1 a 31 que especifica la precisión del resultado. Si no se especifica, el valor por omisión es 15.
escala
Una constante de enteros con un valor en el rango de 0 a precisión que especifica la escala del resultado. Si no se especifica, el valor por omisión es 0.
carácter-decimal
Especifica la constante de caracteres de un solo byte utilizada para delimitar los dígitos decimales en expresión-serie de la parte correspondiente a los enteros del número. El carácter no puede ser un dígito, el signo más (+), el signo menos (-) ni un espacio en blanco y puede aparecer como máximo una vez en expresión-caracteres (SQLSTATE 42815).

El resultado es el mismo número que generaría CAST(expresión-serie AS DECIMAL(precisión, escala)). Los dígitos se truncan al final del número decimal si el número de dígitos a la derecha del carácter separador de decimales es superior al valor de escala. Se devuelve un error si el número de dígitos significativos a la izquierda del carácter decimal (la parte entera del número) de expresión-serie es superior a precisión - escala (SQLSTATE 22003). El carácter decimal por omisión no es válido en la subserie si se especifica un valor diferente para el argumento carácter-decimal (SQLSTATE 22018).

Fecha y hora a DECIMAL
expresión-fecha-hora
Expresión que devuelve un valor del tipo DATE, TIME o TIMESTAMP.
precisión
Una constante de enteros con un valor en el rango de 1 a 31 que especifica la precisión del resultado. Si no se especifica, el valor por omisión para la precisión y la escala depende del tipo de datos de expresión-fecha-hora de la manera siguiente:
  • La precisión es 8 y la escala es 0 para DATE. El resultado es un valor DECIMAL(8,0) que representa la fecha como aaaammdd.
  • La precisión es 6 y la escala es 0 para TIME. El resultado es un valor DECIMAL(6,0) que representa la hora como hhmmss.
  • La precisión es 14+tp y la escala es tp para TIMESTAMP(tp). El resultado es un valor DECIMAL(14+tp,tp) que representa la indicación de fecha y hora como aaaammddhhmmss.nnnnnnnnnnnn.
escala
Una constante de enteros con un valor en el rango de 0 a precisión que especifica la escala del resultado. Si no se especifica y se especifica una precisión, el valor por omisión es 0.

El resultado es el mismo número que generaría CAST(fecha_hora - expresión AS DECIMAL(precisión, escala)). Los dígitos se truncan al final del número decimal si el número de dígitos a la derecha del carácter separador de decimales es superior al valor de escala. Se devuelve un error si el número de dígitos significativos a la izquierda del carácter decimal (la parte entera del número) de expresión-serie es superior a precisión - escala (SQLSTATE 22003).

Si el primer argumento puede ser nulo, el resultado puede ser nulo; si el primer argumento es nulo, el resultado es el valor nulo.
Nota: La especificación CAST debe utilizarse para aumentar la portabilidad de las aplicaciones. Para obtener más información, consulte la especificación CAST.

Ejemplos

  • Ejemplo 1: utilizar la función DECIMAL para forzar a que se devuelva un tipo de datos DECIMAL (con una precisión de 5 y una escala de 2) en una lista-selección para la columna EDLEVEL (tipo de datos = SMALLINT) en la tabla EMPLOYEE. La columna EMPNO debe aparecer también en la lista de selección.
       SELECT EMPNO, DECIMAL(EDLEVEL,5,2)
         FROM EMPLOYEE
  • Ejemplo 2: supongamos que la variable del lenguaje principal PERIOD es de tipo INTEGER. En este caso, para utilizar su valor como duración de fecha debe convertirse a decimal(8,0).
       SELECT PRSTDATE + DECIMAL(:PERIOD,8)
         FROM PROJECT
  • Ejemplo 3: supongamos que las actualizaciones en la columna SALARY se entran mediante una ventana como una serie de caracteres que utiliza la coma como carácter decimal (por ejemplo, el usuario entra 21400,50). Cuando se ha validado por la aplicación,se asigna a la variable del lenguaje principal newsalary definida como CHAR(10).
       UPDATE STAFF
         SET SALARY = DECIMAL(:newsalary, 9, 2, ',')
         WHERE ID = :empid;
    El valor de newsalary se convierte en 21400.50.
  • Ejemplo 4: añadir el carácter decimal por omisión (.) a un valor.
       DECIMAL('21400,50', 9, 2, '.')
    Esto falla debido a que el carácter (.) se especifica como un carácter decimal, pero aparece una coma (,) en el primer argumento como delimitador.
  • Ejemplo 5: supongamos que la columna STARTING (cuyo tipo de datos es TIME) tiene un valor interno equivalente a '12:10:00'.
       DECIMAL(STARTING)
    da como resultado el valor 121 000.
  • Ejemplo 6: supongamos que la columna RECEIVED (cuyo tipo de datos es TIMESTAMP) tiene un valor interno equivalente a '1988-12-22-14.07.21.136421'.
       DECIMAL(RECEIVED)
    da como resultado el valor 19 881 222 140 721.136421.
  • Ejemplo 7: en este ejemplo se muestra el resultado decimal y la precisión y la escala resultante para varios valores de entrada de fecha y hora. Supongamos que existen las columnas siguientes con los valores asociados:
    Nombre de columna Tipo de datos Valor
    ENDDT DATE 2000-03-21
    ENDTM TIME 12:02:21
    ENDTS TIMESTAMP 2000-03-21-12.02.21.123456
    ENDTS0 TIMESTAMP(0) 2000-03-21-12.02.21
    ENDTS9 TIMESTAMP(9) 2000-03-21-12.02.21.123456789
    La tabla siguiente muestra el resultado decimal y la precisión y la escala resultante para varios valores de entrada de fecha y hora.
    DECIMAL(argumentos) Precisión y escala Resultado
    DECIMAL(ENDDT) (8,0) 20000321.
    DECIMAL(ENDDT, 10) (10,0) 20000321.
    DECIMAL(ENDDT, 12, 2) (12,2) 20000321.00
    DECIMAL(ENDTM) (6,0) 120221.
    DECIMAL(ENDTM, 10) (10,0) 120221.
    DECIMAL(ENDTM, 10, 2) (10,2) 120221.00
    DECIMAL(ENDTS) (20, 6) 20000321120221.123456
    DECIMAL(ENDTS, 23) (23, 0) 20000321120221.
    DECIMAL(ENDTS, 23, 4) (23, 4) 20000321120221.1234
    DECIMAL(ENDTS0) (14,0) 20000321120221.
    DECIMAL(ENDTS9) (23,9) 20000321120221.123456789