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/time | Stockage | Recommandation | Description |
---|---|---|---|
abstime | 4 octets | date et time originaux | domaine limité |
date | 4 octets | type SQL92 | large spectre |
datetime | 8 octets | le plus adéquat dans le cas de dates quelconques | large spectre, grande précision |
interval | 12 octets | type SQL92 | équivalent à timespan |
reltime | 4 octets | intervalle de temps d'origine | spectre limité, faible précision |
time | 4 octets | type SQL92 | large spectre |
timespan | 12 octets | le plus adéquat dans le cas d'intervalles de temps quelconques | large spectre, grande précision |
timestamp | 4 octets | type SQL92 | spectre limité |
Tableau 3-8. Étendue Date/Time Postgres
Type Date/Time | Au plus tôt | Au plus tard | Résolution |
---|---|---|---|
abstime | 14-12-1901 | 19-01-2038 | 1 sec |
date | 4713 avant J.C | 32767 après J.C | 1 jour |
datetime | 4713 avant J.C | 1465001 après J.C | de 1 microsec à 14 chiffres |
interval | -178000000 ans | 178000000 ans | 1 microsec (14 chiffres) |
reltime | -68 ans | +68 ans | 1 sec |
time | 00:00:00.00 | 23:59:59.99 | 1 microsec |
timespan | -178000000 ans | 178000000 ans | 1 microsec (14 chiffres) |
timestamp | 14-12-1901 | 19-01-2038 | 1 sec |
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 :
Une zone horaire est associée au type time, mais ce n'est pas cas de date.
La zone horaire par défaut est spécifiée comme un entier constant relatif au temps universel (GMT/UTC) et non de la zone horaire locale.
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.
Il existe quatre styles : ISO-8601, SQL(Ingres), Postgres traditionnel et Allemand (german).
Tableau 3-9. Styles Date Postgres
Spécification | Description | Exemple |
---|---|---|
ISO | standard ISO-8601 | 1997-12-17 07:37:16-08 |
SQL | SQL traditionnel | 12/17/1997 07:37:16.00 PST |
Postgres | Postgres | Wed Dec 17 07:37:16 1997 PST |
German | Allemand | 17.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écification | Description | Exemple |
---|---|---|
European | convention locale | 17/12/1997 15:37:16.00 MET |
NonEuropean | convention locale | 12/17/1997 07:37:16.00 PST |
US | convention locale | 12/17/1997 07:37:16.00 PST |
Il existe plusieurs moyens de spécifier les types date/time :
la variable d'environnement PGDATESTYLE utilisée par le serveur directement au démarrage du postmaster.
la variable d'environnement PGDATESTYLE utilisée par le client libpq au démarrage de la session.
la commande SQL SET DATESTYLE
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.
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.
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 :
La variable d'environnement TZ utilisée par le serveur directement au lancement du postmaster comme zone horaire par défaut.
La variable d'environnement PGTZ indique au client utilisé par libpq d'envoyer l'information sur la zone horaire au serveur au lancement.
La commande SQL SET TIME ZONE indique la zone horaire pour la session.
Si une zone horaire invalide est spécifiée, elle passera en GMT (sur la plupart des systèmes).
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
Constante | Description |
---|---|
current | heure de la transaction en cours, différée |
epoch | 01-01-1970 00:00:00+00 (heure zéro des systèmes Unix) |
infinity | plus tard que tous les temps valides |
-infinity | plus tôt que tous les temps valides |
invalid | entrées illégale |
now | heure de la transaction en cours |
today | minuit aujourd'hui |
tomorrow | minuit demain |
yesterday | minuit hier |
Tableau 3-12. Entrées date Postgres
Exemple | Description |
---|---|
January 8, 1999 | indication de mois ambiguë |
1999-01-08 | ISO-8601 |
1/8/1999 | US; lu comme le premier août en mode européen |
8/1/1999 | Européen; lu comme le premier août en mode US |
1/18/1999 | US; lu comme le 18 janvier dans n'importe quel mode |
1999.008 | année et jour de l'année |
19990108 | ISO-8601 année, mois, jour |
990108 | ISO-8601 année, mois, jour |
1999.008 | année et jour de l'année |
99008 | année et jour de l'année |
January 8, 99 BC | an 99 avant l'ère chrétienne |
Tableau 3-13. Abréviations des mois dans Postgres
Mois | Abréviations |
---|---|
avril | Apr |
août | Aug |
décembre | Dec |
février | Feb |
janvier | Jan |
juillet | Jul |
Juin | Jun |
Mars | Mar |
Novembre | Nov |
Octobre | Oct |
Septembre | Sep, Sept |
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
Jour | Abréviation |
---|---|
dimanche | Sun |
lundi | Mon |
mardi | Tue, Tues |
mercredi | Wed, Weds |
jeudi | Thu, Thur, Thurs |
vendredi | Fri |
samedi | Sat |
Tableau 3-15. Entrées Time Postgres
Exemple | Description |
---|---|
04:05:06.789 | ISO-8601, avec la totalité des styles heure |
04:05:06 | ISO-8601 |
04:05 | ISO-8601 |
040506 | ISO-8601 |
04:05 AM | idem que 04:05; AM n'affecte pas la valeur |
04:05 PM | idem que 16:05; l'heure entrée doit être <= 12 |
z | idem que 00:00:00 |
zulu | idem que 00:00:00 |
allballs | idem que 00:00:00 |
Tableau 3-16. Entrées Zone horaire Postgres
Zone horaire | Description |
---|---|
PST | heure pacifique standard |
-8:00 | ISO-8601 offset for PST |
-800 | ISO-8601 offset for PST |
-8 | ISO-8601 offset for PST |
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.
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 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. |
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.
Note 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. |
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.
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 est un type de données SQL92 qui correspond au timespan de Postgres.
Échelles de temps définies comme :
[ 'abstime' 'abstime'] where abstime is a time in the absolute time format. |