FirebirdSQL logo
 Structure du langage SQLÉléments communs du langage 

Sémantique régionale TIME WITH TIME ZONE

Par définition, les fuseaux horaires régionaux dépendent du temps (date et heure — ou horodatage) pour connaître son décalage UTC par rapport à GMT.Mais Firebird supporte également les fuseaux horaires régionaux dans les valeurs TIME WITH TIME ZONE.

Lors de la construction d’une valeur TIME WITH TIME ZONE à partir d’un littéral ou de sa conversion, la valeur UTC doit être calculée et ne peut pas être modifiée, donc la date actuelle ne peut pas être utilisée.Dans ce cas, la date fixe 2020-01-01 est utilisée.Ainsi, la comparaison de TIME WITH TIME ZONE avec différents fuseaux horaires se fait de la même manière qu’ils représentent les valeurs de TIMESTAMP WITH TIME ZONE à une date donnée.

Cependant, lors de la conversion entre les types TIMESTAMP et TIME WITH TIME ZONE, cette date fixe n’est pas utilisée,sinon, il peut y avoir des conversions étranges où la date actuelle a un décalage différent (en raison des changements d’heure d’été) que dans 2020-01-01.Dans ce cas, la conversion de TIME WITH TIME ZONE en TIMESTAMP WITH TIME ZONE préserve une partie du temps (si possible).Par exemple, si la date actuelle est le 2020-05-03, le décalage effectif dans le fuseau horaire America/Los_Angeles est de -420, et son décalage effectifdans 2020-01-01 est -480, mais cast(time '10:00:00 America/Los_Angeles' as timestamp with time zone) donnera 20-05-03 10:00:00.0000 America/Los_Angeles au lieu de corriger le timestamp.

Mais la date à laquelle l’heure d’été commence manque une heure, par exemple, pour le fuseau horaire America/Los_Angeles en 2021-03-14 il n’y a pas d’heure de 02:00:00 à 02:59:59.Dans ce cas, la conversion est effectuée comme une construction littérale et l’heure est corrigée à la prochaine valeur valide.Par exemple, dans 2021-03-14 cast(time '02:10:00 America/Los_Angeles' as timestamp with time zone) produira un résultat 2021-03-14 03:10:00.0000 America/Los_Angeles.

Litérals de date et d’heure

Firebird utilise des expressions abrégées "style C" pour écrire les littéraux de date et d’heure.La représentation en chaîne de la date et de l’heure doit être dans l’un des formats autorisés.

Syntaxe
<date_literal> ::= DATE <date>

<time_literal> ::= TIME <time>

<timestamp_literal> ::= TIMESTAMP <timestamp>

<date> ::=
  [YYYY<p>]MM<p>DD |
  MM<p>DD[<p>YYYY] |
  DD<p>MM[<p>YYYY] |
  MM<p>DD[<p>YY] |
  DD<p>MM[<p>YY]


<time> := HH[:mm[:SS[.NNNN]]] [<time zone>]

<timestamp> ::= <date> <time>

<time zone> ::=
    <time zone region> |
    [+/-] <hour displacement> [: <minute displacement>]

<p> ::= whitespace | . | : | , | - | /
Table 1. Description du format de la date et de l’heure
Argument Description

datetime

Représentation sous forme de chaîne de la date/heure.

date

Représentation sous forme de chaîne de la date.

time

Représentation sous forme de chaîne de l’heure.

YYYY

Une année à quatre chiffres.

YY

Les deux derniers chiffres de l’année (00-99).

MM

Mois. Peut contenir 1 ou 2 chiffres (1-12 ou 01-12). Comme un mois, il est également permis de spécifier une abréviation de trois lettres ou le nom complet du mois en anglais, le cas n’a pas d’importance.

DD

Jour. Peut contenir 1 ou 2 chiffres (1-31 ou 01-31).

HH

Heure. Peut contenir 1 ou 2 chiffres (0-23 ou 00-23).

mm

Minute. Peut contenir 1 ou 2 chiffres (0-59 ou 00-59).

SS

Seconde.Peut contenir 1 ou 2 chiffres (0-59 ou 00-59).

NNNN

Dix millièmes de seconde. Peut contenir de 1 à 4 chiffres (0-9999).

p

Le séparateur, tous les caractères autorisés, les espaces de début et de fin sont ignorés.

time zone region

Un des fuseaux horaires associés à la région.

hour displacement

Le décalage horaire de l’horloge est relatif à GMT.

minute displacement

Décalage horaire des minutes par rapport à GMT.

Règles :

  • Dans le format Année-Mois-Jour, l’année doit nécessairement contenir 4 chiffres ;

  • Pour les dates au format fin d’année, si un point "." est utilisé comme séparateur de date, la date est interprétée comme Jour-Mois-Année, pour les autres séparateurs, elle est interprétée comme Mois-Jour-Année ;

  • Si une année n’est pas spécifiée, l’année en cours est prise comme année ;

  • Si seulement deux chiffres de l’année sont spécifiés, Firebird utilise un algorithme de fenêtre glissante pour obtenir le siècle. La tâche consiste à interpréter la valeur de l’année à deux chiffres comme étant la plus proche de l’année en cours dans l’intervalle des 50 années précédentes et suivantes ;

  • S’il y a un fuseau horaire ou un décalage horaire dans la représentation temporelle de la chaîne, le type littéral sera WITH TIME ZONE, sinon WITHOUT TIME ZONE ;

  • Si aucun élément de temps n’est spécifié, il est supposé être égal à 0.

Tip

Nous recommandons vivement de n’utiliser que des formulaires comportant l’année complète à 4 chiffres dans les littéraux de date afin d’éviter toute confusion.

Example 1. Exemples de littéraux de date et d’heure
SELECT
  date '04.12.2014' AS d1, -- DD.MM.YYYY
  date '12-04-2014' AS d2, -- MM-DD-YYYY
  date '12/04/2014' AS d3, -- MM/DD/YYYY
  date '04.12.14'  AS d4,   -- DD.MM.YY
  -- DD.MM est considéré comme l'année en cours
  date '04.12' AS d5,
  -- MM/DD est considéré comme l'année en cours
  date '12/4' AS d6,
  date '2014/12/04'  AS d7, -- YYYY/MM/DD
  date '2014.12.04'  AS d8, -- YYYY.MM.DD
  date '2014-12-04'  AS d9, -- YYYY-MM-DD
  time '11:37' AS t1, -- HH:mm
  time '11:37:12' AS t2, -- HH:mm:ss
  time '11:31:12.1234' AS t3, -- HH:mm:ss.nnnn
  -- HH:mm:ss.nnnn +hh
  time '11:31:12.1234 +03' AS t4,
  -- HH:mm:ss.nnnn +hh:mm
  time '11:31:12.1234 +03:30' AS t5,
  -- HH:mm:ss.nnnn tz
  time '11:31:12.1234 Europe/Moscow' AS t5,
  -- HH:mm tz
  time '11:31 Europe/Moscow' AS t6,
  -- DD.MM.YYYY HH:mm
  timestamp '04.12.2014 11:37' AS dt1,
  -- MM/DD/YYYY HH:mm:ss
  timestamp '12/04/2014 11:37:12' AS dt2,
  -- DD.MM.YYYY HH:mm:ss.nnnn
  timestamp '04.12.2014 11:31:12.1234' AS dt3,
  -- YYYY-MM-DD HH:mm:ss.nnnn +hh:mm
  timestamp '2014-12-04 11:31:12.1234 +03:00' AS dt4,
  -- DD.MM.YYYY HH:mm:ss.nnnn tz
  timestamp '04.12.2014 11:31:12.1234 Europe/Moscow' AS dt5
FROM rdb$database
Note

Notez que ces expressions abrégées sont évaluées immédiatement lors de l’analyse syntaxique (préparation d’une requête ou compilation d’une procédure, d’une fonction ou d’un déclencheur). Avant Firebird 4.0, les expressions abrégées étaient également autorisées pour les chaînes de caractères spéciales 'NOW', 'TODAY', 'TOMORROW', 'YESTERDAY'. L’utilisation de telles expressions dans le langage PSQL compilé aurait pour effet de "geler" la valeur au moment de la compilation et de renvoyer une valeur non valide.Par conséquent, dans Firebird 4.0, les expressions abrégées pour de tels littéraux de chaîne sont interdites, mais vous pouvez les utiliser pour les conversions de type CAST.