La soustraction de deux valeurs de date ou d'horodatage dans MaxCompute renvoie un résultat de type INTERVAL, une représentation typée de l'intervalle de temps qui les sépare. MaxCompute propose deux sous-types d'INTERVAL : INTERVAL_YEAR_MONTH pour les intervalles calendaires (années et mois) et INTERVAL_DAY_TIME pour les intervalles de durée fixe (jours, heures, minutes et secondes). Ces deux sous-types reposent sur des échelles de temps différentes et ne peuvent pas être combinés dans des opérations arithmétiques.
Prérequis
Avant de commencer, assurez-vous d'avoir :
-
Activé le système de types MaxCompute 2.0 en exécutant l'instruction suivante dans votre session :
SET odps.sql.type.system.odps2=true;
INTERVAL_YEAR_MONTH
Le type INTERVAL_YEAR_MONTH stocke un intervalle exprimé en années et mois.
Syntaxe
Utilisez le modèle de chaîne indiqué dans la colonne String pattern. Précédez la valeur du modèle par - pour exprimer un intervalle négatif.
|
Syntaxe |
Modèle de chaîne |
Description |
Exemple |
|
|
|
Composantes année et mois |
|
|
|
|
Composante année uniquement |
|
|
|
|
Composante mois uniquement |
|
Plages valides et comportement en cas de dépassement
|
Champ |
Plage valide |
Lorsqu'il est utilisé seul |
Lorsqu'il est combiné à un autre champ |
|
année |
0–9 999 |
Doit rester dans la plage |
Doit rester dans la plage |
|
mois |
0–11 |
Peut dépasser 11 — le dépassement est converti en années |
Ne peut pas dépasser 11 — un dépassement provoque une erreur d'analyse |
Exemple de dépassement pour les mois uniquement
Si vous spécifiez uniquement l'intervalle MONTH, la valeur peut dépasser 11. MaxCompute convertit automatiquement les mois excédentaires en années :
SELECT INTERVAL '200' MONTH;
Résultat :
+------+
| _c0 |
+------+
| 16-8 |
+------+
200 mois équivalent à 16 ans et 8 mois.
YEAR TO MONTH — mois hors plage (erreur)
Avec YEAR TO MONTH, la valeur du mois doit être comprise entre 0 et 11 :
SELECT INTERVAL '-2021-12' YEAR TO MONTH;
Résultat :
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse -2021-12 as a valid INTERVAL_DAY_TIME
INTERVAL_DAY_TIME
Le type INTERVAL_DAY_TIME stocke un intervalle exprimé en jours, heures, minutes, secondes et fractions de seconde.
Syntaxe
Utilisez le modèle de chaîne indiqué dans la colonne String pattern. Précédez la valeur du modèle par - pour exprimer un intervalle négatif.
|
Syntaxe |
Modèle de chaîne |
Description |
Exemple |
|
|
|
Composante jour uniquement |
|
|
|
|
Composante heure uniquement |
|
|
|
|
Composante minute uniquement |
|
|
|
|
Composante seconde uniquement (prend en charge les fractions de seconde) |
|
|
|
|
Composantes jour et heure |
|
|
|
|
Composantes jour, heure et minute |
|
|
|
|
Composantes jour, heure, minute et seconde |
|
|
|
|
Composantes heure et minute |
|
|
|
|
Composantes heure, minute et seconde |
|
|
|
|
Composantes minute et seconde |
|
Plages valides et comportement en cas de dépassement
|
Champ |
Plage valide |
Lorsqu'il est utilisé seul |
Lorsqu'il est combiné à un autre champ |
|
jour |
0–2 147 483 647 |
Doit rester dans la plage |
Doit rester dans la plage |
|
heure |
0–23 |
Peut dépasser 23 — le dépassement est converti en jours |
Ne peut pas dépasser 23 |
|
minute |
0–59 |
Peut dépasser 59 — le dépassement est converti en heures |
Ne peut pas dépasser 59 |
|
seconde |
0–59,999999999 |
Peut dépasser 59 — le dépassement est converti en minutes |
Ne peut pas dépasser 59,999999999 |
Exemple de dépassement pour une unité unique
Si vous spécifiez une seule unité de temps, la valeur peut dépasser sa limite supérieure. MaxCompute convertit automatiquement l'excédent vers l'unité supérieure :
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
Valeur multi-unités hors plage (erreur)
Avec un format multi-unités, chaque champ doit rester dans sa plage valide :
SELECT INTERVAL '23:60' HOUR TO MINUTE;
Résultat :
FAILED: ODPS-0130161:[1,17] Parse exception - cannot parse 23:60 as a valid INTERVAL_DAY_TIME
Opérations prises en charge
Addition ou soustraction de valeurs INTERVAL du même type
L'addition et la soustraction fonctionnent entre des valeurs INTERVAL du même type. Les opérations entre INTERVAL_YEAR_MONTH et INTERVAL_DAY_TIME ne sont pas prises en charge, car ces deux types utilisent des échelles de temps différentes (mois calendaires contre secondes de durée fixe).
Addition de deux valeurs INTERVAL_DAY_TIME :
SELECT INTERVAL '24' HOUR + INTERVAL '23' HOUR;
Résultat :
+----------------------+
| _c0 |
+----------------------+
| 1 23:00:00.000000000 |
+----------------------+
Soustraction de deux valeurs INTERVAL_DAY_TIME :
SELECT INTERVAL '24' HOUR + INTERVAL '-23' HOUR;
Résultat :
+----------------------+
| _c0 |
+----------------------+
| 0 01:00:00.000000000 |
+----------------------+
Soustraction de deux valeurs INTERVAL_YEAR_MONTH :
SELECT INTERVAL '5-1' YEAR TO MONTH - INTERVAL '9-2' YEAR TO MONTH;
Résultat :
+------+
| _c0 |
+------+
| -4-1 |
+------+
Arithmétique entre types différents (erreur) :
SELECT INTERVAL '2000-1' YEAR TO MONTH + INTERVAL '1 23:59:59.999' DAY TO SECOND;
Résultat :
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) INTERVAL_YEAR_MONTH,INTERVAL_DAY_TIME for operator '+'
Soustraction de valeurs DATE, TIMESTAMP ou TIMESTAMP_NTZ pour obtenir un INTERVAL_DAY_TIME
La soustraction de deux valeurs DATE, TIMESTAMP ou TIMESTAMP_NTZ renvoie un résultat de type INTERVAL_DAY_TIME. La soustraction de deux valeurs DATETIME n'est pas prise en charge.
Soustraction de deux valeurs DATE :
SELECT DATE '2021-10-29' - DATE '2024-11-29';
Résultat :
+--------------------------+
| _c0 |
+--------------------------+
| -1127 00:00:00.000000000 |
+--------------------------+
Soustraction de deux valeurs TIMESTAMP :
SELECT TIMESTAMP '2024-11-29 00:01:10' - TIMESTAMP'2021-10-29 00:01:00';
Résultat :
+-------------------------+
| _c0 |
+-------------------------+
| 1127 00:00:10.000000000 |
+-------------------------+
Soustraction de DATETIME (erreur) :
SELECT DATETIME '2024-11-11 00:00:00' - DATETIME'2021-11-11 00:00:00';
Résultat :
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,DATETIME for operator '-'
Addition ou soustraction d'un INTERVAL à une valeur DATE, TIMESTAMP ou TIMESTAMP_NTZ
L'ajout ou la soustraction d'un INTERVAL à une valeur DATE, TIMESTAMP ou TIMESTAMP_NTZ renvoie une valeur du même type. Cette opération n'est pas prise en charge pour les valeurs DATETIME.
Soustraction d'un INTERVAL_YEAR_MONTH à une DATE :
SELECT DATE '2021-11-11' - INTERVAL '-1' MONTH;
Résultat :
+------------+
| _c0 |
+------------+
| 2021-12-11 |
+------------+
Soustraction d'un INTERVAL_DAY_TIME à une TIMESTAMP_NTZ :
SELECT TIMESTAMP_NTZ'2024-11-29 00:01:10' - INTERVAL '1 23' DAY TO HOUR;
Résultat :
+---------------------+
| _c0 |
+---------------------+
| 2024-11-27 01:01:10 |
+---------------------+
DATETIME avec INTERVAL (erreur) :
SELECT DATETIME '2024-11-11 00:00:00' - INTERVAL '1 23' DAY TO HOUR;
Résultat :
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - invalid operand type(s) DATETIME,INTERVAL_DAY_TIME for operator '-'