Opérations sur date/heure et durées

Les valeurs de date et d'heure peuvent être incrémentées, décrémentées et soustraites. Ces opérations peuvent impliquer des nombres décimaux appelés durées.

Durées

Une durée est un nombre représentant un intervalle de temps.

labeled-duration
Read syntax diagramSkip visual syntax diagram function(expression)constantcolumn-nameglobal-variablehost-variable YEARYEARSMONTHMONTHSDAY DAYS1HOURHOURSMINUTEMINUTESSECOND SECONDS2MICROSECONDMICROSECONDS
Notes:
  • 1 DAYS is the default for non-decimal numeric arithmetic involving dates and timestamps.
  • 2 SECONDS is the default for non-decimal numeric arithmetic involving time.
Une durée peut être de l'un des types suivants:
durée qualifiée
Unité de temps spécifique exprimée par un nombre (qui peut être le résultat d'une expression) suivi de l'un des sept mots clés de durée: YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS ou MICROSECONDS. (La forme singulière de ces mots clés est également acceptable: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND et MICROSECOND.) Le nombre spécifié est converti comme s'il avait été affecté à un nombre DECIMAL (15, 0), sauf pour SECONDS qui utilise DECIMAL (27,12) pour autoriser l'inclusion de 0 à 12 chiffres de fractions de secondes. Une durée libellée ne peut être utilisée qu'en tant qu'opérande d'un opérateur arithmétique dans lequel l'autre opérande est une valeur de type de données DATE, TIME ou TIMESTAMP. Ainsi, l'expression HIREDATE + 2 MONTHS + 14 DAYS est valide, alors que l'expression HIREDATE + (2 MONTHS + 14 DAYS) ne l'est pas. Dans ces deux expressions, les durées marquées sont 2 MOIS et 14 DAYS.
durée au format date
Nombre d'années, de mois et de jours, exprimé sous la forme d'un nombre DECIMAL (8, 0). Pour être correctement interprété, le nombre doit être au format aaaammjj., où aaaa représente le nombre d'années, mm le nombre de mois et jj le nombre de jours. (Le point dans le format indique un type de données DECIMAL.) Le résultat de la soustraction d'une valeur de date d'une autre, comme dans l'expression HIREDATE-BRTHDATE, est une durée de date.
durée au format heure
Nombre d'heures, de minutes et de secondes, exprimé sous la forme d'un nombre DECIMAL (6, 0). Pour être correctement interprété, le nombre doit avoir le format hhmmss., où hh représente le nombre d'heures, mm le nombre de minutes et ss le nombre de secondes. (Le point dans le format indique un type de données DECIMAL.) La soustraction de deux valeurs de type heure renvoie une durée de type heure.
durée au format horodatage
Nombre d'années, de mois, de jours, d'heures, de minutes, de secondes et de fractions de secondes, exprimé sous la forme d'un nombre DECIMAL (14 +s,s), où s est le nombre de chiffres de secondes fractionnées allant de 0 à 12. Pour être correctement interprété, le nombre doit avoir le format yyyymmddhhmmss.nnnnnnnnnnnn, où aaaa, mm, jj, hh, mm, sset nnnnnnnnnnnnnn représentent, respectivement, le nombre d'années, de mois, de jours, d'heures, de minutes, de secondes et de fractions de secondes. Le résultat de la soustraction d'une valeur d'horodatage d'une autre est une durée d'horodatage, avec une échelle qui correspond à la précision d'horodatage maximale des opérandes d'horodatage.

Arithmétique de date et d'heure dans SQL

Les seules opérations arithmétiques pouvant être effectuées sur les valeurs de date-heure sont l'addition et la soustraction. Si une valeur de date-heure est l'opérande de l'addition, l'autre opérande doit être une durée. Les règles spécifiques régissant l'utilisation de l'opérateur d'ajout avec des valeurs de date et d'heure suivent.
  • Si un opérande est une date, l'autre opérande doit être une durée de date ou une durée libellée de type YEARS, MONTHS ou DAYS.
  • Si un opérande est une heure, l'autre opérande doit être une durée ou une durée libellée de type HOURS, MINUTES ou SECONDS.
  • Si l'un des opérandes est un horodatage, l'autre doit être une durée. Tout type de durée est valide.
  • Aucun des opérandes de l'opérateur d'ajout ne peut être un marqueur de paramètre.
Les règles d'utilisation de l'opérateur de soustraction sur les valeurs de date-heure ne sont pas les mêmes que celles pour l'ajout car une valeur de date-heure ne peut pas être soustraite d'une durée et parce que l'opération de soustraction de deux valeurs de date-heure n'est pas la même que l'opération de soustraction d'une durée d'une valeur de date-heure. Les règles spécifiques régissant l'utilisation de l'opérateur de soustraction avec des valeurs de date-heure sont les suivantes.
  • Si le premier opérande est un horodatage, le second opérande doit être une date, un horodatage, une représentation de chaîne une date, une représentation de chaîne d'un horodatage, ou une durée. Si le second opérande est une représentation de chaîne d'un horodatage, il est implicitement converti en horodatage avec la même précision que le premier opérande.
  • Si le second opérande est un horodatage, le premier opérande doit être une date, un horodatage, une représentation sous forme de chaîne d'une date , ou une représentation sous forme de chaîne d'un horodatage. Si le premier opérande est une représentation de chaîne d'un horodatage, il est implicitement converti en horodatage avec la même précision que le second opérande.
  • Si le premier opérande est une date, le second opérande doit être une date, une durée de date, une représentation sous forme de chaîne d'une date ou une durée libellée YEARS, MONTHS ou DAYS.
  • Si le second opérande est une date, le premier opérande doit être une date ou une représentation sous forme de chaîne d'une date.
  • Si le premier opérande est une heure, le second opérande doit être une heure, une durée, une représentation sous forme de chaîne d'une heure ou une durée libellée de HOURS, MINUTES ou SECONDS.
  • Si le second opérande est une heure, le premier opérande doit être une heure ou une représentation sous forme de chaîne d'une heure.
  • Aucun des opérandes de l'opérateur de soustraction ne peut être un marqueur de paramètre.

Calcul de la date

Les dates peuvent être soustraites, incrémentées ou décrémentées.

  • Le résultat de la soustraction d'une date (DATE2) d'une autre date (DATE1) est la durée entre les deux dates exprimée en nombre d'années, de mois et de jours. Le type de données du résultat est DECIMAL (8, 0). Si DATE1 est supérieure ou égale à DATE2, cette dernière est soustraite de la première. Toutefois, si DATE1 est inférieur à DATE2, DATE1 est soustrait de DATE2et le signe du résultat devient négatif. La procédure suivante explique l'opération RESULTAT&rbl;=&rbl;DATE1&rbl;-&rbl;DATE2.
       If DAY(DATE2) <= DAY(DATE1)
       then DAY(RESULT) = DAY(DATE1) - DAY(DATE2).
       If DAY(DATE2) > DAY(DATE1)
       then DAY(RESULT) = N + DAY(DATE1) - DAY(DATE2)
       where N = the last day of MONTH(DATE2).
       MONTH(DATE2) is then incremented by 1.
       If MONTH(DATE2) <= MONTH(DATE1)
       then MONTH(RESULT) = MONTH(DATE1) - MONTH(DATE2).
       If MONTH(DATE2) > MONTH(DATE1)
       then MONTH(RESULT) = 12 + MONTH(DATE1) - MONTH(DATE2).
       YEAR(DATE2) is then incremented by 1.
       YEAR(RESULT) = YEAR(DATE1) - YEAR(DATE2).

    Par exemple, le résultat de DATE ('3/15/2000')-'12/31/1999'est 00000215. (ou une durée de 0 ans, 2 mois et 15 jours).

  • Le résultat de l'ajout d'une durée à une date, ou de la soustraction d'une durée à une date, est lui-même une date. (Pour les besoins de cette opération, un mois indique l'équivalent d'une page de calendrier. Ajouter des mois à une date, c'est comme tourner les pages d'un calendrier, en commençant par la page sur laquelle la date apparaît.) Le résultat doit être compris entre les dates du 1er janvier 0001 et du 31 décembre 9999 inclus.

    Si une durée exprimée en années est ajoutée ou soustraite, seule la partie année de la date est affectée. Le mois est inchangé, tout comme le jour, à moins que le résultat ne soit le 29 février d'une année non bissextile. Dans ce cas, le jour est remplacé par 28 et un indicateur d'avertissement dans la SQLCA est défini pour indiquer l'ajustement.

    De même, si une durée de mois est ajoutée ou soustraite, seuls les mois et, si nécessaire, les années sont affectés. La partie jour de la date est inchangée à moins que le résultat ne soit incorrect (31 septembre, par exemple). Dans ce cas, le jour est défini sur le dernier jour du mois et un indicateur d'avertissement dans la SQLCA est défini pour indiquer l'ajustement.

    L'ajout ou la soustraction d'une durée de jours aura, bien sûr, une incidence sur la partie jour de la date, et potentiellement sur le mois et l'année.

    Les durées de date, qu'elles soient positives ou négatives, peuvent également être ajoutées aux dates et en être soustraites. Comme pour les durées étiquetées, le résultat est une date valide et un indicateur d'avertissement est défini dans la SQLCA chaque fois qu'un ajustement de fin de mois est nécessaire.

    Lorsqu'une durée de date positive est ajoutée à une date ou qu'une durée de date négative est soustraite d'une date, la date est incrémentée du nombre spécifié d'années, de mois et de jours, dans cet ordre. Ainsi, DATE1 + X, où X est un nombre DECIMAL positif (8, 0), est équivalent à l'expression:
       DATE1 + YEAR(X) YEARS + MONTH(X) MONTHS + DAY(X) DAYS.
    Lorsqu'une durée de date positive est soustraite d'une date ou qu'une durée de date négative est ajoutée à une date, la date est décrémentée du nombre de jours, de mois et d'années spécifié, dans cet ordre. Ainsi, DATE1 -X, où X est un nombre positif DECIMAL (8, 0), est équivalent à l'expression:
       DATE1 - DAY(X) DAYS - MONTH(X) MONTHS - YEAR(X) YEARS.

    Lors de l'ajout de durées à des dates, l'ajout d'un mois à une date donnée donne la même date un mois plus tard, sauf si cette date n'existe pas dans le mois suivant. Dans ce cas, la date est celle du dernier jour du mois suivant. Par exemple, le 28 janvier plus un mois donne le 28 février ; et un mois ajouté au 29, 30 ou 31 janvier donne le 28 février ou, pour une année bissextile, le 29 février.

    Remarque: Si un ou plusieurs mois sont ajoutés à une date donnée et que le même nombre de mois est soustrait du résultat, la date finale n'est pas nécessairement la même que la date d'origine.

Arithmétique de temps

Les heures peuvent être soustraites, incrémentées ou décrémentées.

  • Lorsqu'une heure (HEURE2) est soustraite d'une autre heure (HEURE1), une durée de type heure est renvoyée. Cette durée indique le nombre d'heures, de minutes et de secondes séparant HEURE1 et HEURE2. Le type de données du résultat est DECIMAL (6, 0).

    Si TIME1 est supérieur ou égal à TIME2, TIME2 est soustrait de TIME1.

    Toutefois, si TIME1 est inférieur à TIME2, TIME1 est soustrait de TIME2et le signe du résultat devient négatif. La description de procédure suivante clarifie les étapes impliquées dans le résultat de l'opération = TIME1 - TIME2.
       If SECOND(TIME2) <= SECOND(TIME1)
       then SECOND(RESULT) = SECOND(TIME1) - SECOND(TIME2).
       If SECOND(TIME2) > SECOND(TIME1)
       then SECOND(RESULT) = 60 + SECOND(TIME1) - SECOND(TIME2).
       MINUTE(TIME2) is then incremented by 1.
       If MINUTE(TIME2) <= MINUTE(TIME1)
       then MINUTE(RESULT) = MINUTE(TIME1) - MINUTE(TIME2).
       If MINUTE(TIME1) > MINUTE(TIME1)
       then MINUTE(RESULT) = 60 + MINUTE(TIME1) - MINUTE(TIME2).
       HOUR(TIME2) is then incremented by 1.
       HOUR(RESULT) = HOUR(TIME1) - HOUR(TIME2).

    Par exemple, le résultat de TIME ('11:02:26')-'00:32:56'est 102930. (durée de 10 heures, 29 minutes et 30 secondes).

  • Le résultat de l'ajout d'une durée à une heure, ou de la soustraction d'une durée à une heure, est lui-même une heure. Tout dépassement ou sous-débit d'heures est éliminé, ce qui garantit que le résultat est toujours un temps. Lorsqu'une durée exprimée en heures est ajoutée ou soustraite, seule la partie correspondant aux heures est affectée. Les minutes et les secondes sont inchangées.

    De même, si une durée de minutes est ajoutée ou soustraite, seules les minutes et, si nécessaire, les heures sont affectées. La partie du temps correspondant aux secondes reste inchangée.

    L'ajout ou la soustraction d'une durée de secondes affectera bien entendu la partie secondes du temps, et potentiellement les minutes et les heures.

    Les durées, qu'elles soient positives ou négatives, peuvent également être ajoutées et soustraites des durées. Le résultat est une heure qui a été incrémentée ou décrémentée du nombre spécifié d'heures, de minutes et de secondes, dans cet ordre. TIME1 + X, où "X" est un nombre décimal (6, 0), est équivalent à l'expression:
       TIME1 + HOUR(X) HOURS + MINUTE(X) MINUTES + SECOND(X) SECONDS

    Lors de la soustraction d'une durée étiquetée de SECOND ou SECONDS avec une valeur incluant des fractions de seconde, la soustraction est effectuée comme si la valeur temporelle avait jusqu'à 12 secondes fractionnaires mais le résultat est renvoyé avec les secondes fractionnaires tronquées.

    Remarque: Bien que l'heure'24:00:00'soit acceptée comme heure valide, elle n'est jamais renvoyée en tant que résultat de l'ajout ou de la soustraction de l'heure, même si l'opérande de durée est égal à zéro (par exemple, heure ('24:00:00') ± 0 secondes ='00:00:00').

Arithmétique d'horodatage

Les horodatages peuvent être soustraits, incrémentés ou décrémentés.

  • Le résultat de la soustraction d'un horodatage (TS2) d'un autre (TS1) est une durée d'horodatage qui indique le nombre d'années, de mois, de jours, d'heures, de minutes, de secondes et de fractions de secondes entre les deux horodatages. Le type de données du résultat est DECIMAL (14 +s,s), où s est la précision d'horodatage maximale de TS1 et TS2.
    Si TS1 est supérieur ou égal à TS2, TS2 est soustrait de TS1. Toutefois, si TS1 est inférieur à TS2, TS1 est soustrait de TS2 et le signe du résultat devient négatif. La description de procédure suivante clarifie les étapes impliquées dans le résultat de l'opération = TS1 - TS2:
        If SECOND(TS2,s) <= SECOND(TS1,s)
        then SECOND(RESULT,s) = SECOND(TS1,s) -
        SECOND(TS2,s).
        If SECOND(TS2,s) > SECOND(TS1,s)
        then SECOND(RESULT,s) = 60 +
        SECOND(TS1,s) - SECOND(TS2,s).
        MINUTE(TS2) is then incremented by 1.
    La partie minutes des horodatages est soustraite comme indiqué dans les règles de soustraction des temps.
       If HOUR(TS2) <= HOUR(TS1)
       then HOUR(RESULT) = HOUR(TS1) - HOUR(TS2).
       If HOUR(TS2) > HOUR(TS1)
       then HOUR(RESULT) = 24 + HOUR(TS1) - HOUR(TS2)
       and DAY(TS2) is incremented by 1.

    La partie date des horodatages est soustraite comme indiqué dans les règles de soustraction des dates.

  • Le résultat de la soustraction d'une date (D1) à un horodatage (TS1) est identique à la soustraction de TIMESTAMP (D1) à TS1. De même, le résultat de la soustraction d'un horodatage (TS1) d'une date (D2) est identique à la soustraction de TS1 de TIMESTAMP (D2).
  • Le résultat de l'ajout d'une durée à un horodatage ou de la soustraction d'une durée à un horodatage est lui-même un horodatage.La précision de l'horodatage de résultat correspond à la précision de l'opérande d'horodatage. La partie arithmétique de date est effectuée comme précédemment défini, à ceci près qu'un dépassement ou un sous-débit d'heures est reporté dans la partie date du résultat, qui doit être comprise dans la plage de dates valides. La partie arithmétique de temps est similaire à l'arithmétique de temps, à ceci près qu'elle prend également en compte les fractions de secondes comprises dans la durée. Ainsi, la soustraction d'une durée, X, d'un horodatage, TIMESTAMP1, où X est un nombre DECIMAL (14+s,s), équivaut à l'expression:
       TIMESTAMP1 - YEAR(X)  YEARS - MONTH(X)  MONTHS - DAY(X)  DAYS
                  - HOUR(X)  HOURS - MINUTE(X)  MINUTES - SECOND(X, s)  SECONDS

    Lors de la soustraction d'une durée avec une échelle non nulle ou d'une durée libellée de type SECOND ou SECONDS avec une valeur incluant des fractions de seconde, la soustraction est effectuée comme si la valeur d'horodatage avait jusqu'à 12 secondes décimales. La valeur résultante est affectée à une valeur d'horodatage avec la précision d'horodatage de l'opérande d'horodatage, ce qui peut entraîner la troncature de fractions de seconde.