FirebirdSQL logo

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.

Opérations utilisant les valeurs de date et d’heure

En raison de la manière dont la date et l’heure sont stockées avec ces types, il est possible d’effectuer des opérations arithmétiques pour soustraire une date (heure) antérieure d’une date (heure) ultérieure.La date est représentée par le nombre de jours depuis la "date zéro" - le 17 novembre 1858.Le temps est représenté par le nombre de secondes (décimales comprises) écoulées depuis minuit.

Table 1. Opérations arithmétiques pour les types de données date et heure
Opérande 1 Opérateur Opérande 2 Résultat

DATE

+

TIME

TIMESTAMP

DATE

+

TIME WITH TIME ZONE

TIMESTAMP WITH TIME ZONE

DATE

+

Valeur numérique n

DATE, augmenté de n jours entiers (la partie fractionnaire est ignorée).

TIME

+

DATE

TIMESTAMP

TIME WITH TIME ZONE

+

DATE

TIMESTAMP WITH TIME ZONE

TIME

+

Valeur numérique n

TIME, augmenté de n secondes (nombre de parties fractionnaires).

TIME WITH TIME ZONE

+

Valeur numérique n

TIME WITH TIME ZONE, augmenté de n secondes (nombre de parties fractionnaires).

TIMESTAMP

+

Valeur numérique n

TIMESTAMP, où la date sera augmentée du nombre de jours et de la partie du jour représentée par le nombre n - donc “+ 2.75” avancera la date de 2 jours et 18 heures.

TIMESTAMP WITH TIME ZONE

+

Valeur numérique n

TIMESTAMP WITH TIME ZONE, où la date sera augmentée du nombre de jours et de la partie du jour représentée par le nombre n - donc “+ 2.75” avancera la date de 2 jours et 18 heures.

DATE

-

DATE

Nombre de jours dans l’intervalle comme DECIMAL (9, 0).

DATE

-

Valeur numérique n

DATE, réduit de n jours entiers (la partie fractionnaire est ignorée).

TIME

-

TIME

Le nombre de secondes dans l’intervalle comme DECIMAL (9, 4).

TIME

-

n

TIME, réduit de n secondes (nombre de parties fractionnaires).

TIME

-

TIME WITH TIME ZONE

La valeur sans fuseau horaire est convertie en WITH TIME ZONE dans le fuseau horaire de la session en cours.Le nombre de secondes entre les valeurs UTC est renvoyé comme suit DECIMAL(9, 4).La même règle s’applique lorsque l’ordre des opérandes est modifié.

TIME WITH TIME ZONE

-

TIME WITH TIME ZONE

Le nombre de secondes entre les valeurs UTC est renvoyé comme suit DECIMAL(9, 4).

TIMESTAMP

-

TIMESTAMP

Nombre de jours et de parties d’un jour dans un intervalle comme DECIMAL (18, 9).

TIMESTAMP

-

TIMESTAMP WITH TIME ZONE

La valeur sans fuseau horaire est convertie en WITH TIME ZONE dans le fuseau horaire de la session en cours.Le nombre de jours et de parties de la journée entre les valeurs UTC en tant que DECIMAL (18, 9).La même règle s’applique lorsque l’ordre des opérandes est modifié.

TIMESTAMP

-

n

TIMESTAMP, où la date sera réduite par le nombre de jours, et la partie du jour représentée par le nombre n - ainsi “`- 2.25`” reculera la date de 2 jours et 6 heures.

TIMESTAMP WITH TIME ZONE

-

n

TIMESTAMP WITH TIME ZONE, où la date sera réduite par le nombre de jours, et la partie du jour représentée par le nombre n - ainsi “`- 2.25`” reculera la date de 2 jours et 6 heures.

Une valeur de date/heure peut être soustraite de l’autre si :

  • Les deux valeurs sont du même type de date/heure ;

  • Le premier opérande est plus récent que le deuxième opérande.

Note

Dans le dialecte 1, le type DATE est traité comme TIMESTAMP.