Types date/time

Il existe deux types fondamentaux de mesure pour la date et l'heure : le temps absolu et les intervalles relatifs.

Postgres fournit deux types primaires date et time orientés utilisateur, datetime et timespan, de même que les types SQL92, timestamp, interval, date et time.

Dans les futures versions, datetime et timespan se fondront dans les types SQL92, timestamp et interval. D'autres types de représentation du temps (date et heure) sont aussi disponibles, la plupart pour des raisons historiques.

Tableau 3-7. Types Date/Time Postgres

Type date/timeStockageRecommandationDescription
abstime4 octetsdate et time originauxdomaine limité
date4 octetstype SQL92large spectre
datetime8 octetsle plus adéquat dans le cas de dates quelconqueslarge spectre, grande précision
interval12 octetstype SQL92équivalent à timespan
reltime4 octetsintervalle de temps d'originespectre limité, faible précision
time4 octetstype SQL92large spectre
timespan12 octetsle plus adéquat dans le cas d'intervalles de temps quelconqueslarge spectre, grande précision
timestamp4 octetstype SQL92spectre limité
Timestamp est implémenté séparemment de datetime, bien qu'ils partagent les routines d'entrée/sortie.

Tableau 3-8. Étendue Date/Time Postgres

Type Date/TimeAu plus tôtAu plus tardRésolution
abstime14-12-190119-01-20381 sec
date4713 avant J.C32767 après J.C1 jour
datetime4713 avant J.C1465001 après J.Cde 1 microsec à 14 chiffres
interval-178000000 ans178000000 ans1 microsec (14 chiffres)
reltime-68 ans+68 ans1 sec
time00:00:00.0023:59:59.991 microsec
timespan-178000000 ans178000000 ans1 microsec (14 chiffres)
timestamp14-12-190119-01-20381 sec

Conventions SQL92

Les auteurs de Postgres s'efforcent de ménager la compatibilité avec les définitions SQL92. Le standard SQL92 est un mélange spécial de types date/time. Il existe deux problèmes évidents :

Cependant, les zones horaires, dans la réalité, peuvent ne pas avoir de signification quand elles sont associées avec une date en fonction des zones horaires et des limites de changement de jour.

Pour faire face à ces difficultés, Postgres associe les zones horaires avec les seuls types date et time, lesquels contiennent ensemble la date et l'heure, et suppose être en heure locale pour n'importe quel type contenant seulement date ou time. De plus, la zone horaire est dérivée des possibilités du système sous jacent concernant la gestion des divers changements de date et heure.

Dans les versions futures, il y aura moins de types date/time, avec les implémentations de datetime devenant timestamp, timespan devenant interval, et (peut-être) abstime et reltime devenant obsolètes vis-à-vis de timestamp et interval.

Styles date/time

Il existe quatre styles : ISO-8601, SQL(Ingres), Postgres traditionnel et Allemand (german).

Tableau 3-9. Styles Date Postgres

SpécificationDescriptionExemple
ISOstandard ISO-86011997-12-17 07:37:16-08
SQLSQL traditionnel12/17/1997 07:37:16.00 PST
PostgresPostgresWed Dec 17 07:37:16 1997 PST
GermanAllemand17.12.1997 07:37:16.00 PST

Le style SQL possède des variantes européennes et non européennes (US) qui déterminent le comportement de l'analyseur (Jour/Mois/An ou M/J/A).

Tableau 3-10. Conventions de manipulation des dates

SpécificationDescriptionExemple
Europeanconvention locale17/12/1997 15:37:16.00 MET
NonEuropeanconvention locale12/17/1997 07:37:16.00 PST
USconvention locale12/17/1997 07:37:16.00 PST

Il existe plusieurs moyens de spécifier les types date/time :

Pour la version 6.4 (et plus anciennes) de Postgres le style date/time par défaut est "non-European traditional Postgres". Dans les futures versions le style par défaut pourra devenir ISO-8601, lequel réduit l'ambiguïté sur les spécifications de date et les problèmes de confrontation à l'an 2000.

Calendrier

Postgres utilise le calendrier Julien pour le calcul des dates et des heures. Il a la propriété de calculer/prévoir n'importe quelle date plus récente que 4713 avant J.C. en supposant que la longueur de l'année est de 365.2425 jours.

Les conventions de date avant le 19e siècle, sont intéressantes à lire mais n'offrent aucune garantie pour le codage dans date/time.

Zones horaires

Postgres récupère la zone horaire sur le système d'exploitation. Toutes les dates et heures sont stockées en UTC (Universal Coordinated Time) ou GMT (Greenwich Mean Time). Les heures sont converties en heure locale sur le serveur de la base avant d'être envoyées au client qui travaille par défaut en respectant la zone horaire du serveur.

Il existe plusieurs façons de modifier la zone horaire :

Si une zone horaire invalide est spécifiée, elle passera en GMT (sur la plupart des systèmes).

Entrée date/time

L'usage général de date et time est une entrée utilisant une large étendue de styles, incluant ISO-compatible, Postgres traditionnel et d'autres permutations de date et time. Dans les cas où l'interprétation peut être ambiguë (tout à fait possible avec de nombreuses spécifications de style de date) Postgres utilise un style pour résoudre l'ambiguïté.

La plupart des types date et time partagent le même code de gestion des données saisies. Pour ces types l'entrée peut avoir une grande variété de styles. Pour la représentation numérique des dates, les conventions européennes et américaines peuvent differer, et l'interprétation correcte est obtenue en utilisant la commande SET DATESTYLE avant d'entrer les données. Notez que cela ne doit pas empêcher l'utilisation des différents styles d'entrée ; il est utilisé en premier pour déterminer les styles sortie et pour résoudre les ambiguïtés.

Les valeurs spéciales current, infinity et -infinity sont fournies. infinity désigne une heure plus tard que n'importe quel temps valide, et -infinity un temps plus tôt que n'importe quel temps valide. current indique que l'heure courante doit être substituée chaque fois que cette valeur apparaît dans le calcul (computation).

Les chaînes now, today, yesterday, tomorrow et epoch peuvent être utilisées pour définir des valeurs de temps. now indique l'heure de la transaction courante, et diffère de current en ce que l'heure courante lui est alors immédiatement substituée. epoch indique Jan 1 00:00:00 1970 GMT.

Tableau 3-11. Constantes spéciales date/time Postgres

ConstanteDescription
currentheure de la transaction en cours, différée
epoch01-01-1970 00:00:00+00 (heure zéro des systèmes Unix)
infinityplus tard que tous les temps valides
-infinityplus tôt que tous les temps valides
invalidentrées illégale
nowheure de la transaction en cours
todayminuit aujourd'hui
tomorrowminuit demain
yesterdayminuit hier

Tableau 3-12. Entrées date Postgres

ExempleDescription
January 8, 1999indication de mois ambiguë
1999-01-08ISO-8601
1/8/1999US; lu comme le premier août en mode européen
8/1/1999Européen; lu comme le premier août en mode US
1/18/1999US; lu comme le 18 janvier dans n'importe quel mode
1999.008année et jour de l'année
19990108ISO-8601 année, mois, jour
990108ISO-8601 année, mois, jour
1999.008année et jour de l'année
99008année et jour de l'année
January 8, 99 BCan 99 avant l'ère chrétienne

Tableau 3-13. Abréviations des mois dans Postgres

MoisAbréviations
avrilApr
aoûtAug
décembreDec
févrierFeb
janvierJan
juilletJul
JuinJun
MarsMar
NovembreNov
OctobreOct
SeptembreSep, Sept

Note

Le mois de May (mai) n'a pas d'abbréviation pour des raisons évidentes.

Tableau 3-14. Abréviations des jours de la semaine dans Postgres

JourAbréviation
dimancheSun
lundiMon
mardiTue, Tues
mercrediWed, Weds
jeudiThu, Thur, Thurs
vendrediFri
samediSat

Tableau 3-15. Entrées Time Postgres

ExempleDescription
04:05:06.789ISO-8601, avec la totalité des styles heure
04:05:06ISO-8601
04:05ISO-8601
040506ISO-8601
04:05 AMidem que 04:05; AM n'affecte pas la valeur
04:05 PMidem que 16:05; l'heure entrée doit être <= 12
zidem que 00:00:00
zuluidem que 00:00:00
allballsidem que 00:00:00

Tableau 3-16. Entrées Zone horaire Postgres

Zone horaireDescription
PSTheure pacifique standard
-8:00ISO-8601 offset for PST
-800ISO-8601 offset for PST
-8ISO-8601 offset for PST

Note

Si l'option de compliation USE_AUSTRALIAN_RULES est indiquée alors EST renvoie au Australia Eastern Std Time, qui a un décallage de +10:00 sur le temps UTC/GMT.

Les zones horaires australiennes et leur différentes appellations, comptent pour un bon quart de la table de zone horaire de Postgres.

Datetime

L'usage général de date et time est une entrée utilisant une grande variété de styles, incluant ISO-compatible, Postgres traditionnel (voir section sur "absolute time") et autres permutations de date et time. Les styles sortie peuvent être ISO-compatible, SQL-compatible, ou Postgres traditionnel, avec une gestion par défaut compatible Postgres v6.0.

on défini datetime par la syntaxe :
Year-Month-Day [ Hour : Minute : Second ]      [AD,BC] [ Timezone ]
  YearMonthDay [ Hour : Minute : Second ]      [AD,BC] [ Timezone ]
     Month Day [ Hour : Minute : Second ] Year [AD,BC] [ Timezone ]
where	
    Year is 4013 BC, ..., very large
    Month is Jan, Feb, ..., Dec or 1, 2, ..., 12
    Day is 1, 2, ..., 31
    Hour is 00, 02, ..., 23
    Minute is 00, 01, ..., 59
    Second is 00, 01, ..., 59 (60 for leap second)
    Timezone is 3 characters or ISO offset to GMT

Les dates valides sont comprises entre le 13 novembre 4013 avant J.C à 00:00:00 GMT et très loin dans le futur. Les zones horaires ont chacune trois caractères (ex.GMT ou PST) ou sont compatibles ISO (ex."-08" ou "-08:00" en Pacific Standard Time). Les dates sont stockées en interne en GMT. Les routines de gestion d'entrées/sorties convertissent les heures en fonction de la zone horaire du serveur.

timespan

timespan est une entrée utilisant une grande variétés de syntaxes, incluant ISO-compatible, SQL-compatible, Postgres traditionnel (voir section "relative time") et autres permutations. Les formats de sortie peuvent être ISO-compatible, SQL-compatible, ou Postgres traditionnel, avec le placement par défaut pour être Postgres compatible. Les mois et les années représentent un intervale de temps "qualitatif", et sont stockés séparément des autres intervales de temps "quantitatifs" comme le jour et l'heure. Pour les dates arithmétiques, les unités de temps qualitatives sont dépendantes du contexte de la date et de l'heure qui s'y rapportent.

timespan est défini par la syntaxe :
  Quantity Unit [Quantity Unit...] [Direction]
@ Quantity Unit [Direction]
where 	
    Quantity is ..., -1, 0, 1, 2, ...
    Unit is second, minute, hour, day, week, month, year,
      decade, century, millenium, or abbreviations or plurals of these units.
    Direction is ago.

abstime

Le temps absolu (abstime) a un champ limité (+/- 68 ans) et une précision limitée également (1 seconde). datetime peut être préféré, depuis qu'il couvre un large champ avec une plus grande précision.

Absolute time est défini par la syntaxe :
Month  Day [ Hour : Minute : Second ]  Year [ Timezone ]
where	
    Month is Jan, Feb, ..., Dec
    Day is 1, 2, ..., 31
    Hour is 01, 02, ..., 24
    Minute is 00, 01, ..., 59
    Second is 00, 01, ..., 59
    Year is 1901, 1902, ..., 2038

Les dates valides démarrent du 13 dec 20:45:53 1901 GMT au 19 jan 03:14:04 2038 GMT.

NoteNote historique
 

jusqu'à la version 3.0, les heures n'étaient pas lues ni écrites en utilisant le GMT; les routines d'entrée et sortie utilisaient les zones horaires locales.

Toutes les valeurs spéciales disponibles pour datetime le sont aussi pour "absolute time".

reltime

Le temps relatif, reltime, a un champ limité (+/- 68 ans) et une précision limitée également (1 seconde). timespan sera préféré, depuis qu'il couvre un champ plus large avec une grande précision, et plus important, peut distinguer entre les unités relatives (mois, années) et les unités quantitatives (jours, heure, etc.). reltime doit forcer les mois pour obtenir exactement 30 jours, mais le temps arithmétique n'a pas toujours le comportement attendu. Par exemple, ajouter un reltime year à abstime today ne produit pas la date d'aujourd'hui sur une année à partir de maintenant, mais une date de 360 jours depuis aujourd'hui.

reltime partage les routines entrée et sortie avec les autres types time span. La section sur timespan couvre ceci en détail.

timestamp

Temps absolu avec un champ limité, ressemble au type abstime. Dans les futures versions ce type absorbera les possibilités du type datetime et sera conforme au SQL92.

timestamp est défini par la même syntaxe que datetime.

interval

interval est un type de données SQL92 qui correspond au timespan de Postgres.

tinterval

Échelles de temps définies comme :
[ 'abstime' 'abstime']
where
    abstime is a time in the absolute time format.
Les valeurs spéciales abstime comme current, infinity et -infinity peuvent être utilisées.