Cuando resta dos valores de fecha o de timestamp en MaxCompute, el resultado es un INTERVAL: una representación tipada del intervalo de tiempo transcurrido entre ambos. MaxCompute proporciona dos subtipos de INTERVAL: INTERVAL_YEAR_MONTH para intervalos de calendario en años y meses, e INTERVAL_DAY_TIME para intervalos de duración fija en días, horas, minutos y segundos. Estos subtipos se basan en escalas de tiempo diferentes y no pueden combinarse en operaciones aritméticas.
Requisitos previos
Antes de empezar, asegúrese de:
-
Habilitar el sistema de tipos de MaxCompute 2.0. Para ello, ejecute en su sesión la instrucción que se muestra a continuación:
SET odps.sql.type.system.odps2=true;
INTERVAL_YEAR_MONTH
INTERVAL_YEAR_MONTH almacena un intervalo en años y meses.
Sintaxis
Use el patrón de cadena que se muestra en la columna String pattern. Anteponga - al valor del patrón para expresar un intervalo negativo.
|
Syntax |
String pattern |
Description |
Example |
|
|
|
Componentes de año y mes |
|
|
|
|
Solo componente de año |
|
|
|
|
Solo componente de mes |
|
Rangos válidos y comportamiento ante desbordamientos
|
Field |
Valid range |
When used alone |
When combined with another field |
|
año |
0–9,999 |
Debe permanecer dentro del rango |
Debe permanecer dentro del rango |
|
mes |
0–11 |
Puede exceder 11; el excedente se convierte en años |
No puede exceder 11; excederlo causa un error de análisis sintáctico |
Ejemplo de desbordamiento con solo MONTH
Cuando especifique solo el intervalo MONTH, el valor puede exceder 11. MaxCompute convierte los meses excedentes en años automáticamente:
SELECT INTERVAL '200' MONTH;
Resultado:
+------+
| _c0 |
+------+
| 16-8 |
+------+
200 meses = 16 años y 8 meses.
YEAR TO MONTH: mes fuera de rango (error)
Al usar YEAR TO MONTH, el valor de mes debe estar entre 0 y 11:
SELECT INTERVAL '-2021-12' YEAR TO MONTH;
Resultado:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse -2021-12 as a valid INTERVAL_DAY_TIME
INTERVAL_DAY_TIME
INTERVAL_DAY_TIME almacena un intervalo en días, horas, minutos, segundos y fracciones de segundo.
Sintaxis
Use el patrón de cadena que se muestra en la columna String pattern. Anteponga - al valor del patrón para expresar un intervalo negativo.
|
Syntax |
String pattern |
Description |
Example |
|
|
|
Solo componente de día |
|
|
|
|
Únicamente componente de hora |
|
|
|
|
Componente de minuto solamente |
|
|
|
|
Solo componente de segundo (compatible con las fracciones de segundo) |
|
|
|
|
Componentes de día y hora |
|
|
|
|
Día, hora y minuto |
|
|
|
|
Día, hora, minuto y segundo |
|
|
|
|
Componentes de hora y minuto |
|
|
|
|
Hora, minuto y segundo |
|
|
|
|
Minuto y segundo |
|
Rangos válidos y comportamiento ante desbordamientos
|
Field |
Valid range |
When used alone |
When combined with another field |
|
día |
0–2,147,483,647 |
Debe permanecer dentro del rango |
Debe permanecer dentro del rango |
|
hora |
0–23 |
Puede exceder 23; el excedente se convierte en días |
No puede exceder 23 |
|
minuto |
0–59 |
Puede exceder 59; el excedente se convierte en horas |
No puede exceder 59 |
|
segundo |
0–59.999999999 |
Puede exceder 59; el excedente se convierte en minutos |
No puede exceder 59.999999999 |
Ejemplo de desbordamiento de una sola unidad
Cuando especifique una sola unidad de tiempo, el valor puede exceder su límite superior. MaxCompute convierte el excedente a la siguiente unidad más grande automáticamente:
SELECT INTERVAL '24' HOUR; -- Equivalent to INTERVAL '1' DAY
SELECT INTERVAL '60' MINUTE; -- Equivalent to INTERVAL '1' HOUR
SELECT INTERVAL '6000' SECOND; -- Equivalent to INTERVAL '1:40' HOUR TO MINUTE
Valor de varias unidades fuera de rango (error)
Al usar un formato de varias unidades, cada campo debe permanecer dentro de su rango válido:
SELECT INTERVAL '23:60' HOUR TO MINUTE;
Resultado:
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse 23:60 as a valid INTERVAL_DAY_TIME
Operaciones compatibles
Sumar o restar valores INTERVAL del mismo tipo
La suma y la resta funcionan entre valores INTERVAL del mismo tipo. Las operaciones entre INTERVAL_YEAR_MONTH e INTERVAL_DAY_TIME no son compatibles; ambos tipos usan escalas de tiempo diferentes (meses de calendario frente a segundos de duración fija).
Sumar dos valores INTERVAL_DAY_TIME:
SELECT INTERVAL '24' HOUR + INTERVAL '23' HOUR;
Resultado:
+----------------------+
| _c0 |
+----------------------+
| 1 23:00:00.000000000 |
+----------------------+
Restar dos valores INTERVAL_DAY_TIME:
SELECT INTERVAL '24' HOUR + INTERVAL '-23' HOUR;
Resultado:
+----------------------+
| _c0 |
+----------------------+
| 0 01:00:00.000000000 |
+----------------------+
Restar dos valores INTERVAL_YEAR_MONTH:
SELECT INTERVAL '5-1' YEAR TO MONTH - INTERVAL '9-2' YEAR TO MONTH;
Resultado:
+------+
| _c0 |
+------+
| -4-1 |
+------+
Operación aritmética entre tipos (error):
SELECT INTERVAL '2000-1' YEAR TO MONTH + INTERVAL '1 23:59:59.999' DAY TO SECOND;
Resultado:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) INTERVAL_YEAR_MONTH,INTERVAL_DAY_TIME for operator '+'
Restar valores DATE, TIMESTAMP o TIMESTAMP_NTZ para obtener un INTERVAL_DAY_TIME
Restar dos valores DATE, TIMESTAMP o TIMESTAMP_NTZ devuelve un resultado INTERVAL_DAY_TIME. La resta de dos valores DATETIME no es compatible.
Restar dos valores DATE:
SELECT DATE '2021-10-29' - DATE '2024-11-29';
Resultado:
+--------------------------+
| _c0 |
+--------------------------+
| -1127 00:00:00.000000000 |
+--------------------------+
Restar dos valores TIMESTAMP:
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';
Resultado:
+-------------------------+
| _c0 |
+-------------------------+
| 1127 00:00:10.000000000 |
+-------------------------+
Resta de DATETIME (error):
SELECT DATETIME '2024-11-11 00:00:00' - DATETIME'2021-11-11 00:00:00';
Resultado:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,DATETIME for operator '-'
Sumar o restar un INTERVAL a un valor DATE, TIMESTAMP o TIMESTAMP_NTZ
Sumar o restar un INTERVAL a un valor DATE, TIMESTAMP o TIMESTAMP_NTZ devuelve un valor del mismo tipo. Esta operación no es compatible con los valores DATETIME.
Restar un INTERVAL_YEAR_MONTH de un DATE:
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;
Resultado:
+------------+
| _c0 |
+------------+
| 2021-12-11 |
+------------+
Restar un INTERVAL_DAY_TIME de un TIMESTAMP_NTZ:
SELECT TIMESTAMP_NTZ'2024-11-29 00:01:10' - INTERVAL '1 23' DAY TO HOUR;
Resultado:
+---------------------+
| _c0 |
+---------------------+
| 2024-11-27 01:01:10 |
+---------------------+
DATETIME con INTERVAL (error):
SELECT DATETIME '2024-11-11 00:00:00' - INTERVAL '1 23' DAY TO HOUR;
Resultado:
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,INTERVAL_DAY_TIME for operator '-'