Función escalar ROUND

La función ROUND devuelve un valor redondeado de un valor numérico o de hora y fecha:

ROUND numérico

Read syntax diagramSkip visual syntax diagramROUND(numeric-expression1 ,0,numeric-expression2 )

ROUND fecha-hora

Read syntax diagramSkip visual syntax diagramROUND(datetime-expression ,'DD',format-stringlocale-name )

El esquema es SYSIBM. La versión SYSFUN de la función numérica ROUND sigue estando disponible.

El valor de retorno depende del primer argumento:
  • Si el resultado del primer argumento es un valor numérico, las funciones ROUND devuelven un número, redondeado truncado en el número de posiciones especificado, a la derecha o izquierda de la coma decimal.
  • Si el primer argumento es DATE, TIME o TIMESTAMP, las funciones ROUND devuelven un valor de fecha y hora, redondeado a la unidad especificada por una serie-formato.
ROUND numérico

Si expresión-numérica-1 es un valor positivo, un dígito con el valor 5 o un valor superior indica que se redondeará al número positivo siguiente. Por ejemplo, ROUND(3.5,0) = 4. Si expresión-numérica-1 es un valor negativo, un dígito con el valor 5 o superior es una indicación para redondear al número negativo anterior. Por ejemplo, ROUND(-3.5,0) = -4.

numeric-expression1
Una expresión que debe devolver un valor que sea un tipo de datos numérico o CHAR, VARCHAR, GRAPHIC o VARGRAPHIC incorporado. Si el valor no es un tipo de datos numérico, se convierte de forma implícita en DECFLOAT(34) antes de evaluar la función.

Si la expresión es un tipo de datos de coma flotante decimal, la modalidad de redondeo DECFLOAT no se utilizará. El comportamiento de redondeo de ROUND corresponde a un valor de ROUND_HALF_UP. Si se desea otro comportamiento de redondeo, utilice la función QUANTIZE.

numeric-expression2
Expresión que devuelve un valor que es un tipo de datos numérico incorporado. Si el valor no es del tipo INTEGER, se convierte de forma implícita en INTEGER antes de evaluar la función.

Si expresión-numérica-2 no es negativa, expresión-numérica-1 se redondea al valor absoluto de expresión-numérica-2 posiciones a la derecha de la coma decimal.

Si expresión-numérica-2 es negativa, expresión-numérica-1 se redondea al valor absoluto de expresión-numérica-2+1 número de posiciones a la izquierda de la coma decimal.

Si el valor absoluto de una expresión-numérica2 negativa es mayor que el número de dígitos a la izquierda del separador decimal, el resultado es 0. Por ejemplo, ROUND(748,58,-4) = 0. Si numeric-expression1 es positivo, un valor de dígito de 5 se redondea al siguiente número positivo más alto. Si expresión-numérica-1 es un valor negativo, un dígito con el valor 5 se redondeará al número negativo anterior.

El tipo de datos y el atributo de longitud del resultado coinciden con el tipo de datos y el atributo de longitud del primer argumento, con la excepción de que la precisión aumenta en uno si expresión-numérica-1 es DECIMAL y la precisión es menor que 31. Por ejemplo, un argumento con un tipo de datos de DECIMAL(5,2) da como resultado DECIMAL(6,2). Un argumento con un tipo de datos de DECIMAL(31,2) da como resultado DECIMAL(31,2). La escala es igual que la escala del primer argumento.

Si cualquiera de los argumentos puede ser nulo o si el argumento no es un número de coma flotante decimal y la base de datos se ha configurado con dft_sqlmathwarn establecido en YES, el resultado puede ser nulo. Si cualquiera de los argumentos es nulo, el resultado es el valor nulo.

Esta función no queda afectada por el valor del registro especial CURRENT DECFLOAT ROUNDING MODE, incluso para argumentos de coma flotante decimal. El comportamiento de redondeo de ROUND corresponde a un valor de ROUND_HALF_UP. Si para un valor de coma flotante decimal desea un comportamiento que se ajuste a la modalidad de redondeo especificada por el registro especial CURRENT DECFLOAT ROUNDING MODE, utilice la función QUANTIZE en su lugar.

ROUND datetime
Si expresión-fecha-hora tiene un tipo de datos de fecha y hora, la función ROUND devuelve expresión-fecha-hora redondeada a la unidad especificada por la serie-formato. Si no se especifica serie-formato, expresión-fecha-hora se redondea al día más cercano, como si se especificara 'DD' para serie-formato.
expresión-fecha-hora
Una expresión que debe devolver un valor que sea una fecha, una hora o una indicación de fecha y hora. Las representaciones de serie de estos tipos de datos no reciben soporte y deben convertirse explícitamente en un valor DATE, TIME o TIMESTAMP para poder utilizarlas con esta función; de forma alternativa, puede utilizar la función ROUND_TIMESTAMP para una representación de serie de una fecha o indicación de fecha y hora.
serie-formato
Una expresión que devuelve un tipo de datos de serie de caracteres incorporado con una longitud real que no es superior a 255 bytes. El elemento de formato de serie-formato especifica cómo debe redondearse expresión-fecha-hora. Por ejemplo, si serie-formato es 'DD', una indicación de fecha y hora que se represente mediante una expresión-fecha-hora se redondea al día más cercano. Los espacios en blanco iniciales y finales se eliminan de la serie y la subserie resultante debe ser un elemento de formato válido para el tipo de expresión-fecha-hora (SQLSTATE 22007). El valor predeterminado es 'DD', que no se puede utilizar si el tipo de datos de expresión-fecha-hora es TIME.

Los valores permitidos para serie-formato se listan en la tabla de elementos de formato listados en la Tabla 1.

nombre-entorno-local
Constante de caracteres que especifica el entorno local que se utiliza para determinar el primer día de la semana cuando se utilizan valores de elemento de formato DAY, DY o D. El valor de nombre-entorno-local no es sensible a las mayúsculas y minúsculas y debe ser un entorno local válido (SQLSTATE 42815). Para obtener información sobre los entornos locales válidos y sus nombres, consulte la sección Nombres de entorno local para SQL y XQuery. Si no se especifica nombre-entorno-local, se utiliza el valor del registro especial CURRENT LOCALE LC_TIME.
El resultado de la función tiene el mismo tipo DATE que expresión-fecha-hora. El resultado puede ser nulo; si cualquier argumento es nulo, el resultado es el valor nulo.

Los elementos de formato siguientes se utilizan para identificar la unidad de redondeo o truncamiento del valor de fecha y hora en las funciones ROUND, ROUND_TIMESTAMP, TRUNCATE y TRUNC_TIMESTAMP.

Tabla 1. Elementos de formato para ROUND, ROUND_TIMESTAMP, TRUNCATE y TRUNC_TIMESTAMP
Elemento de formato Unidad de redondeo o truncamiento Ejemplo de ROUND Ejemplo de TRUNCATE
CC
SCC
Siglo

Redondea hasta el inicio del siglo siguiente a partir del año 50 del siglo (por ejemplo, 1951-01-01-00.00.00).

No es válido para el argumento TIME.

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1901-01-01-00.00.00.000000

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1801-01-01-00.00.00.000000

SYYYY
YYYY
YEAR
SYEAR
YYY
YY
Y
Año

Redondea a partir del 1 de julio al 1 de enero del año siguiente.

No es válido para el argumento TIME.

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1898-01-01-00.00.00.000000

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1897-01-01-00.00.00.000000

IYYY
IYY
IY
I
Año ISO

Redondea a partir del 1 de julio al primer día del año ISO siguiente. El primer día del año ISO es el lunes de la primera semana ISO.

No es válido para el argumento TIME.

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1898-01-03-00.00.00.000000

Valor de entrada:
1897-12-04-12.22.22.000000

Resultado:
1897-01-04-00.00.00.000000

Q Trimestre

Redondea a partir del día 16 del segundo mes del trimestre.

No es válido para el argumento TIME.

Valor de entrada:
1999-06-04-12.12.30.000000

Resultado:
1999-07-01-00.00.00.000000

Valor de entrada:
1999-06-04-12.12.30.000000

Resultado:
1999-04-01-00.00.00.000000

MONTH
MON
MM
RM
Mes

Redondea a partir del día 16 del mes.

No es válido para el argumento TIME.

Valor de entrada:
1999-06-18-12.12.30.000000

Resultado:
1999-07-01-00.00.00.000000

Valor de entrada:
1999-06-18-12.12.30.000000

Resultado:
1999-06-01-00.00.00.000000

WW Mismo día de la semana que el primer día del año.

Redondea a partir de las 12 horas del cuarto día de la semana con respecto al primer día del año.

No es válido para el argumento TIME.

Valor de entrada:
2000-05-05-12.12.30.000000

Resultado:
2000-05-06-00.00.00.000000

Valor de entrada:
2000-05-05-12.12.30.000000

Resultado:
2000-04-29-00.00.00.000000

IW Mismo día de la semana que el primer día del año ISO. Consulte Función escalar WEEK_ISO para obtener más detalles.

Redondea a partir de las 12 horas del cuarto día de la semana con respecto al primer día del año ISO.

No es válido para el argumento TIME.

Valor de entrada:
2000-05-05-12.12.30.000000

Resultado:
2000-05-08-00.00.00.000000

Valor de entrada:
2000-05-05-12.12.30.000000

Resultado:
2000-05-01-00.00.00.000000

W Mismo día de la semana que el primer día del año.

Redondea a partir de las 12 horas del cuarto día de la semana con respecto al primer día del mes.

No es válido para el argumento TIME.

Valor de entrada:
2000-06-21-12.12.30.000000

Resultado:
2000-06-22-00.00.00.000000

Valor de entrada:
2000-06-21-12.12.30.000000

Resultado:
2000-06-15-00.00.00.000000

DDD
DD
J
Día

Redondea a partir de las 12 horas del día.

No es válido para el argumento TIME.

Valor de entrada:
2000-05-17-12.59.59.000000

Resultado:
2000-05-18-00.00.00.000000

Valor de entrada:
2000-05-17-12.59.59.000000

Resultado:
2000-05-17-00.00.00.000000

DAY
DY
D
Primer día de la semana.

Redondea con respecto a las 12 horas del cuarto día de la semana. El primer día de la semana depende del entorno local (vea el nombre-entorno-local).

No es válido para el argumento TIME.

Valor de entrada:
2000-05-17-12.59.59.000000

Resultado:
2000-05-21-00.00.00.000000

Valor de entrada:
2000-05-17-12.59.59.000000

Resultado:
2000-05-14-00.00.00.000000

HH
HH12
HH24
Hora

Redondea a partir del minuto 30.

Valor de entrada:
2000-05-17-23.59.59.000000

Resultado:
2000-05-18-00.00.00.000000

Valor de entrada:
2000-05-17-23.59.59.000000

Resultado:
2000-05-17-23.00.00.000000

MI Minute

Redondea a partir del segundo 30.

Valor de entrada:
2000-05-17-23.58.45.000000

Resultado:
2000-05-17-23.59.00.000000

Valor de entrada:
2000-05-17-23.58.45.000000

Resultado:
2000-05-17-23.58.00.000000

SS Second

Redondea a partir de medio segundo.

Valor de entrada:
2000-05-17-23.58.45.500000

Resultado:
2000-05-17-23.58.46.000000

Valor de entrada:
2000-05-17-23.58.45.500000

Resultado:
2000-05-17-23.58.45.000000

Nota: Los elementos de formato de la Tabla 1 deben especificarse en mayúsculas.

Si para un argumento de fecha se especifica un elemento de formato que se aplica a la parte de hora de un valor, el argumento de fecha se devuelve sin cambios. Si para un argumento de hora se especifica un elemento de formato que no es válido para este tipo de argumento, se devuelve un error (SQLSTATE 22007).

Notas

  • Determinismo: ROUND es una función determinista. Sin embargo, las invocaciones siguientes de la función dependen del valor del registro especial CURRENT LOCALE LC_TIME.
    • Redondeo de un valor de fecha y hora cuando no se especifica explícitamente nombre-entorno-local y cuando una de las afirmaciones siguientes es verdadera:
      • serie-formato no es una constante
      • serie-formato es una constante e incluye elementos de formato que son sensibles al entorno local
      Las invocaciones de la función que dependen del valor de un registro especial no se pueden utilizar donde no se puedan utilizar registros especiales (SQLSTATE 42621, 428EC o 429BX).

ejemplos

  • Ejemplo 1: Calcule el valor de 873.726, redondeado a 2, 1, 0, -1, -2, -3 y -4 posiciones decimales, respectivamente.
       VALUES (
         ROUND(873.726, 2),
         ROUND(873.726, 1),
         ROUND(873.726, 0),
         ROUND(873.726,-1),
         ROUND(873.726,-2),
         ROUND(873.726,-3),
         ROUND(873.726,-4) )
    Este ejemplo devuelve:
    1         2         3         4         5         6         7
    --------- --------- --------- --------- --------- --------- ---------
      873.730   873.700   874.000   870.000   900.000  1000.000     0.000
  • Ejemplo 2: realizar el cálculo utilizando números positivos y negativos.
       VALUES (
         ROUND(3.5, 0),
         ROUND(3.1, 0),
         ROUND(-3.1, 0),
         ROUND(-3.5,0) )
    Este ejemplo devuelve:
    1    2    3    4
    ---- ---- ---- ----
     4.0  3.0 -3.0 -4.0
  • Ejemplo 3: Calcule el número de coma flotante decimal 3.12350 redondeado a tres decimales.
       VALUES (
         ROUND(DECFLOAT('3.12350'), 3))
    Este ejemplo devuelve:
    1
    -----
    3.12400
    
  • Ejemplo 4: Establezca la variable del lenguaje principal RND_DT con la fecha de entrada redondeada al valor de mes más cercano.
       SET :RND_DATE = ROUND(DATE('2000-08-16'), 'MONTH');    
    El valor establecido es 2000-09-01.
  • Ejemplo 5: Establezca la variable del lenguaje principal RND_TMSTMP con la indicación de fecha y hora de entrada redondeada al valor de año más cercano.
       SET :RND_TMSTMP = ROUND(TIMESTAMP('2000-08-14-17.30.00'),
                               'YEAR');
    El valor establecido es 2001-01-01-00.00.00.000000.