PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.22 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs pour date/heure

9.9. Fonctions et opĂ©rateurs pour date/heure

Tableau 9.32 affiche les fonctions disponibles pour le traitement de valeurs date/heure, avec des dĂ©tails dans les sections suivantes. Tableau 9.31 illustre le comportement des opĂ©rateurs arithmĂ©tiques de base (+, *, etc.). Pour les fonctions de formatage, rĂ©fĂ©rez-vous Ă  Section 9.8. Vous devez ĂȘtre dĂ©jĂ  familier avec les types de donnĂ©es date/heure (voir Section 8.5).

De plus, les opĂ©rateurs de comparaison habituels affichĂ©s dans Tableau 9.1 sont disponibles pour les types date/heure. Les dates et timestamps (avec ou sans fuseau horaire) sont tous comparables, alors que les heures (avec et sans fuseau horaire) et les intervalles peuvent seulement ĂȘtre comparĂ©s aux autres valeurs du mĂȘme type de donnĂ©es. Lors de la comparaison d'un timestamp sans fuseau horaire Ă  un timestamp avec fuseau horaire, la premiĂšre valeur est supposĂ©e ĂȘtre donnĂ©e dans le fuseau horaire indiquĂ© par le paramĂštre de configuration TimeZone, et est transformĂ©e en UTC our comparaison avec la deuxiĂšme valeur (qui est dĂ©jĂ  en UTC). De façon similaire, une valeur date est supposĂ©e reprĂ©senter minuit dans la zone TimeZone lors de la comparaison avec un timestamp.

Toutes les fonctions et tous les opĂ©rateurs dĂ©crits ci-dessous, prenant en entrĂ©e des arguments de type time ou timestamp viennent en deux variantes : une qui prend le type time with time zone ou timestamp with time zone, et une qui prend le type time without time zone ou timestamp without time zone. Pour ne pas trop grossir la documentation, ces variantes ne sont pas affichĂ©es sĂ©parĂ©ment. De plus, les opĂ©rateurs + et * viennent sous la forme de paires commutatives (par exemple, Ă  la fois date + integer et integer + date) ; nous ne prĂ©sentons qu'une seule des deux.

Tableau 9.31. OpĂ©rateurs Date/Heure

Opérateur

Description

Exemple(s)

date + integer → date

Ajoute un nombre de jours Ă  une date

date '2001-09-28' + 7 → 2001-10-05

date + interval → timestamp

Ajouter un interval Ă  une date

date '2001-09-28' + interval '1 hour' → 2001-09-28 01:00:00

date + time → timestamp

Ajoute une heure du jour Ă  une date

date '2001-09-28' + time '03:00' → 2001-09-28 03:00:00

interval + interval → interval

Ajoute des intervalles

interval '1 day' + interval '1 hour' → 1 day 01:00:00

timestamp + interval → timestamp

Ajoute un interval Ă  un timestamp

timestamp '2001-09-28 01:00' + interval '23 hours' → 2001-09-29 00:00:00

time + interval → time

Ajoute un interval Ă  une heure

time '01:00' + interval '3 hours' → 04:00:00

- interval → interval

Passe un interval en négatif

- interval '23 hours' → -23:00:00

date - date → integer

Soustrait des dates, produisant le nombre de jours passés

date '2001-10-01' - date '2001-09-28' → 3

date - integer → date

Soustrait un nombre de jours d'une date

date '2001-10-01' - 7 → 2001-09-24

date - interval → timestamp

Soustrait un interval d'une date

date '2001-09-28' - interval '1 hour' → 2001-09-27 23:00:00

time - time → interval

Soustrait des heures

time '05:00' - time '03:00' → 02:00:00

time - interval → time

Soustrait un interval d'une heure

time '05:00' - interval '2 hours' → 03:00:00

timestamp - interval → timestamp

Soustrait un interval d'un timestamp

timestamp '2001-09-28 23:00' - interval '23 hours' → 2001-09-28 00:00:00

interval - interval → interval

Soustrait des intervalles

interval '1 day' - interval '1 hour' → 1 day -01:00:00

timestamp - timestamp → interval

Soustrait des timestamps (convertissant des intervalles sur 24 heures en jours, de façon similaire à justify_hours())

timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' → 1 day 15:00:00

interval * double precision → interval

Multiplie un interval Ă  une valeur scalaire

interval '1 second' * 900 → 00:15:00

interval '1 day' * 21 → 21 days

interval '1 hour' * 3.5 → 03:30:00

interval / double precision → interval

Divise un interval par une valeur scalaire

interval '1 hour' / 1.5 → 00:40:00


Tableau 9.32. Fonctions Date/Heure

Fonction

Description

Exemple(s)

age ( xid ) → integer

Renvoie le nombre de transactions entre l'identifiant de transaction fourni et le compteur actuel de transaction.

mxid_age ( xid ) → integer

Renvoie le nombre d'identifiant MultiXact entre l'identifiant MultiXact fourni et le compteur actuel de MultiXact.

age ( timestamp, timestamp ) → interval

Soustrait les arguments, produisant un rĂ©sultat « symbolique Â» qui utilise des annĂ©es et des mois, plutĂŽt que simplement des jours

age(timestamp '2001-04-10', timestamp '1957-06-13') → 43 years 9 mons 27 days

age ( timestamp ) → interval

Soustrait l'argument de current_date (Ă  minuit)

age(timestamp '1957-06-13') → 62 years 6 mons 10 days

clock_timestamp ( ) → timestamp with time zone

Date et heure actuelles (change lors de l'exĂ©cution d'une requĂȘte) ; voir Section 9.9.4

clock_timestamp() → 2019-12-23 14:39:53.662522-05

current_date → date

Date actuelle ; voir Section 9.9.4

current_date → 2019-12-23

current_time → time with time zone

Heure actuelle du jour ; voir Section 9.9.4

current_time → 14:39:53.662522-05

current_time ( integer ) → time with time zone

Haure actuelle du jour avec une prĂ©cision limitĂ©e ; voir Section 9.9.4

current_time(2) → 14:39:53.66-05

current_timestamp → timestamp with time zone

Date et heure actuelles (dĂ©but de la transaction en cours) ; voir Section 9.9.4

current_timestamp → 2019-12-23 14:39:53.662522-05

current_timestamp ( integer ) → timestamp with time zone

Date et heure actuelles (dĂ©but de la transaction en cours) avec une prĂ©cision limitĂ©e ; voir Section 9.9.4

current_timestamp(0) → 2019-12-23 14:39:53-05

date_part ( text, timestamp ) → double precision

Obtenir un champ du timestamp (Ă©quivalent Ă  extract) ; voir Section 9.9.1

date_part('hour', timestamp '2001-02-16 20:38:40') → 20

date_part ( text, interval ) → double precision

Obtenir un champ interval (Ă©quivalent Ă  extract) ; voir Section 9.9.1

date_part('month', interval '2 years 3 months') → 3

date_trunc ( text, timestamp ) → timestamp

Tronque Ă  la prĂ©cision spĂ©cifiĂ©e ; voir Section 9.9.2

date_trunc('hour', timestamp '2001-02-16 20:38:40') → 2001-02-16 20:00:00

date_trunc ( text, timestamp with time zone, text ) → timestamp with time zone

Tronque Ă  une prĂ©cision spĂ©cifiĂ©e dans le fuseau horaire indiquĂ© ; voir Section 9.9.2

date_trunc('day', timestamptz '2001-02-16 20:38:40+00', 'Australia/Sydney') → 2001-02-16 13:00:00+00

date_trunc ( text, interval ) → interval

Tronque Ă  la prĂ©cision spĂ©cifiĂ©e ; voir Section 9.9.2

date_trunc('hour', interval '2 days 3 hours 40 minutes') → 2 days 03:00:00

extract ( field from timestamp ) → double precision

Obtenir un champ du timestamp ; voir Section 9.9.1

extract(hour from timestamp '2001-02-16 20:38:40') → 20

extract ( field from interval ) → double precision

Obtenir un champ interval ; voir Section 9.9.1

extract(month from interval '2 years 3 months') → 3

isfinite ( date ) → boolean

Test pour une date finie (différent de +/-infinity)

isfinite(date '2001-02-16') → true

isfinite ( timestamp ) → boolean

Test pour un timestamp fini (différent de +/-infinity)

isfinite(timestamp 'infinity') → false

isfinite ( interval ) → boolean

Test pour un interval fini (actuellement toujours vrai)

isfinite(interval '4 hours') → true

justify_days ( interval ) → interval

Ajuste un interval en convertissant les périodes de 30 jours en mois

justify_days(interval '1 year 65 days') → 1 year 2 mons 5 days

justify_hours ( interval ) → interval

Ajuste un interval en convertissant les périodes de 24 heures en jour

justify_hours(interval '50 hours 10 minutes') → 2 days 02:10:00

justify_interval ( interval ) → interval

Adjuste un interval en utilisant justify_days et justify_hours, avec des ajustements de signe supplémentaire

justify_interval(interval '1 mon -1 hour') → 29 days 23:00:00

localtime → time

Heure actuelle du jour ; voir Section 9.9.4

localtime → 14:39:53.662522

localtime ( integer ) → time

Heure actuelle du jour avec une prĂ©cision limitĂ©e ; voir Section 9.9.4

localtime(0) → 14:39:53

localtimestamp → timestamp

Date et heure actuelles (dĂ©but de la transaction en cours) ; voir Section 9.9.4

localtimestamp → 2019-12-23 14:39:53.662522

localtimestamp ( integer ) → timestamp

Date et heure actuelles (dĂ©but de la transaction en cours), avec une prĂ©cision limitĂ©e ; voir Section 9.9.4

localtimestamp(2) → 2019-12-23 14:39:53.66

make_date ( year int, month int, day int ) → date

Crée une date à partir des champs année, mois et jour

make_date(2013, 7, 15) → 2013-07-15

make_interval ( [ years int [, months int [, weeks int [, days int [, hours int [, mins int [, secs double precision ]]]]]]] ) → interval

Crée un interval à partir des champs année, mois, semaine, jour, heure, minute et seconde, chacun ayant zéro comme valeur par défaut

make_interval(days => 10) → 10 days

make_time ( hour int, min int, sec double precision ) → time

Crée une heure à partir des champs heure, minute et seconde

make_time(8, 15, 23.5) → 08:15:23.5

make_timestamp ( year int, month int, day int, hour int, min int, sec double precision ) → timestamp

Crée un timestamp à partir des champs année, mois, jour, heure, minute et seconde

make_timestamp(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5

make_timestamptz ( year int, month int, day int, hour int, min int, sec double precision [, timezone text ] ) → timestamp with time zone

CrĂ©e un timestamp avec fuseau horaire Ă  partir des champs annĂ©e, mois, jour, heure, minute et seconde ; si timezone n'est pas spĂ©cifiĂ©, le fuseau horaire actuel est utilisĂ©

make_timestamptz(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5+01

now ( ) → timestamp with time zone

Date et heure actuelles (dĂ©but de la transaction en cours) ; voir Section 9.9.4

now() → 2019-12-23 14:39:53.662522-05

statement_timestamp ( ) → timestamp with time zone

Date et heure actuelles (dĂ©but de la requĂȘte en cours) ; voir Section 9.9.4

statement_timestamp() → 2019-12-23 14:39:53.662522-05

timeofday ( ) → text

Date et heure actuelles (comme clock_timestamp, mais sous la forme d'une chaĂźne de type text) ; voir Section 9.9.4

timeofday() → Mon Dec 23 14:39:53.662522 2019 EST

transaction_timestamp ( ) → timestamp with time zone

Date et heure actuelles (dĂ©but de la transaction en cours) ; voir Section 9.9.4

transaction_timestamp() → 2019-12-23 14:39:53.662522-05

to_timestamp ( double precision ) → timestamp with time zone

Convertit un epoch Unix (secondes depuis 1970-01-01 00:00:00+00) en timestamp avec fuseau horaire

to_timestamp(1284352323) → 2010-09-13 04:32:03+00


En plus de ces fonctions, l'opĂ©rateur SQL OVERLAPS est gĂ©rĂ© :

(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
  

Cette expression renvoie true quand deux pĂ©riodes de temps (dĂ©finies par leur point final) se chevauchent et false dans le cas contraire. Les points finaux peuvent ĂȘtre indiquĂ©s sous la forme d'une paires de dates, heures ou dates et heures, ou Ă  une date, heure ou date et heure suivie par un intervalle. Quand une paire de valeurs est fournie, soit le dĂ©but soit la fin peuvent ĂȘtre Ă©crit en premier ; OVERLAPS prend automatiquement la valeur la plus ancienne de la paire comme valeur de dĂ©part. Chaque pĂ©riode de temps est considĂ©rĂ©e comme reprĂ©sentant l'intervalle Ă  moitiĂ© ouvert start <= time < end, sauf si start et end sont Ă©gaux, auquel cas elle reprĂ©sente uniquement cet instant. Ceci signifie que deux pĂ©riodes de temps avec seulement le point final en commun ne se surchargent pas.

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Résultat : true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
       (DATE '2001-10-30', DATE '2002-10-30');
Résultat : false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Résultat : false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
       (DATE '2001-10-30', DATE '2001-10-31');
Résultat : true
 

Lors de l'ajout (ou de la soustraction) d'une valeur interval Ă  une valeur timestamp with time zone, le nombre de jours augmente ou dĂ©crĂ©mente la date de timestamp with time zone par le nombre de jours indiquĂ©, conservant Ă  l'identique l'heure du jour. Si cela intervient Ă  une pĂ©riode de changement d'heure pour le fuseau horaire utilisĂ©, cela signifie que interval '1 day' n'est pas forcĂ©ment Ă©quivalent Ă  interval '24 hours'. Par exemple, avec le fuseau horaire America/Denver :

SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '1 day';
Résultat : 2005-04-03 12:00:00-06
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '24 hours';
Résultat : 2005-04-03 13:00:00-06
  

Ceci survient parce qu'une heure a été ignorée à cause d'un changement d'heure à 2005-04-03 02:00:00 pour le fuseau horaire America/Denver.

Notez qu'il peut avoir une ambiguïté dans le champ months renvoyé par la fonction age parce que des mois différents ont des numéros de jour différents. L'approche de PostgreSQL utilise le mois de la date la plus ancienne lors du calcul de mois partiels. Par exemple, age('2004-06-01', '2004-04-30') utilise avril pour renvoyer 1 mon 1 day, alors que mai renverrait 1 mon 2 days parce que mai a 31 jours alors qu'avril n'en a que 30.

La soustraction de dates et de timestamps peut aussi ĂȘtre complexe. Une façon simple conceptuellement de rĂ©aliser une soustraction est de convertir chaque valeur en un nombre de secondes en utilisant EXTRACT(EPOCH FROM ...), puis de soustraire les rĂ©sultats ; ceci donne un nombre de secondes entre les deux valeurs. Ceci provoquera un ajustement suivant le nombre de jours pour chaque mois, les changements de fuseaux horaires et les ajustements pour les changements d'heure. La soustraction de valeurs date ou timestamp avec l'opĂ©rateur « - Â» renvoie le nombre de jours (24 heures) et les heures/minutes/secondes entre les valeurs, en faisant les mĂȘmes ajustements. La fonction age renvoie les annĂ©es, mois, jours et heures/minutes/secondes, soustrayant champ par champ, puis ajustant les valeurs nĂ©gatives. Les requĂȘtes suivantes illustrent les diffĂ©rences dans ces approches. Les rĂ©sultats correspondent au fuseau horaire timezone = 'US/Eastern' ; il y a un changement d'heure entre les deux dates utilisĂ©es :

SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
       EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
Résultat : 10537200
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
        EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
        / 60 / 60 / 24;
Résultat : 121.958333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
Résultat : 121 days 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
Résultat : 4 mons
 

9.9.1. EXTRACT, date_part

EXTRACT(field FROM source)
  

La fonction extract rĂ©cupĂšre les champs tels que l'annĂ©e ou l'heure de valeurs date/heure. source doit ĂȘtre l'expression d'une valeur de type timestamp, date, time ou interval. (Les donnĂ©es de type timestamp ou time peuvent ĂȘtre avec ou sans fuseau horaire.) field est un identifiant ou une chaĂźne qui sĂ©lectionne le champ Ă  extraire Ă  partir de la valeur source. Les champs ne sont pas tous valides pour chaque type de donnĂ©e en entrĂ©e ; par exemple, les champs plus petit qu'un jour ne peuvent pas ĂȘtre extraits Ă  partir d'une donnĂ©e de type date, alors que les champs d'un jour ou plus ne peuvent pas ĂȘtre extraits d'un type time. La fonction extract renvoie des valeurs de type double precision. Voici les noms de champ valides :

century

Le siĂšcle ; pour les valeurs de type interval, le champ year divisĂ© par 100

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
Résultat : 20
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 21
SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD');
Result: 1
SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC');
Result: -1
SELECT EXTRACT(CENTURY FROM INTERVAL '2001 years');
Result: 20
      
day

Le jour du mois (1–31) ; pour les valeurs interval, le nombre de jours

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 16
SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
Résultat : 40
      
decade

Le champ année divisé par 10

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 200
      
dow

Le jour de la semaine du dimanche (0) au samedi (6)

SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 5
      

Notez que la numérotation du jour de la semaine d'aprÚs extract diffÚre de celle de la fonction to_char(..., 'D').

doy

Le jour de l'annĂ©e (1–365/366)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 47
      
epoch

Pour les valeurs de type timestamp with time zone, le nombre de secondes depuis le 1er janvier 1970 à minuit UTC. Ce nombre est négatif pour les timestamps avant cette valeur. Pour les valeurs de type date et timestamp, le nombre de secondes depuis le 1er janvier 1970 à minuit, heure locale, sans regard au fuseau horaire ou aux rÚgles de changement d'heure. pour les valeurs de type interval, le nombre total de secondes dans l'intervalle

SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Résultat : 982384720.12
SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12');
Résultat : 982355920.12
SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Résultat : 442800
      

Vous pouvez convertir une valeur epoch en une valeur de type timestamp with time zone avec la fonction to_timestamp :

SELECT to_timestamp(982384720.12);
Résultat : 2001-02-17 04:38:40.12+00
      

Attention que l'application de to_timestamp Ă  un epoch extrait d'une valeur date ou timestamp pourrait produire un rĂ©sultat trompeur : le rĂ©sultat supposera en fait que la valeur originale a Ă©tĂ© donnĂ©e en UTC, ce qui pourrait ne pas ĂȘtre le cas.

hour

Le champ heure (0–23 pour les donnĂ©es de type timestamp, sans contrainte pour les intervals)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 20
      
isodow

Le jour de la semaine du lundi (1) au dimanche (7)

SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
Résultat : 7
      

Ceci est identique à dow sauf pour les dimanches. Ceci correspond à la numérotation du jour de la semaine d'aprÚs ISO 8601.

isoyear

L'année suivant la numérotation semaine ISO 8601 dans laquelle la date tombe

SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
Résultat : 2005
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
Résultat : 2006
      

Chaque année suivant la numérotation semaine ISO 8601 commence le lundi de la semaine contenant le 4 janvier, donc un janvier débutant tÎt ou un décembre finissant tard pourrait faire que l'année ISO soit différente de l'année grégorienne. Voir le champ week pour plus d'informations.

julian

La Date Julien correspondant Ă  la date ou Ă  l'horodatage. Les horodatages qui ne sont pas Ă  minuit heure locale rĂ©sultent en une valeur fractionnelle. Voir Section B.7 pour plus d'informations.

SELECT EXTRACT(JULIAN FROM DATE '2006-01-01');
Result: 2453737
SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00');
Result: 2453737.5
microseconds

Le champ des secondes, incluant la partie fractionnelle, multipliĂ© par 1 000 000 ; notez que ceci inclut des secondes complĂštes

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Résultat : 28500000
      
millennium

Le millĂ©naire ; pour les valeurs de type interval, le champ year divisĂ© par 1000

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 3
SELECT EXTRACT(MILLENNIUM FROM INTERVAL '2001 years');
Result: 2
      

Les années 1900 sont dans le deuxiÚme millénaire. Le troisiÚme millénaire commence le 1er janvier 2001.

milliseconds

Le champ des secondes, incluant la partie fractionnelle, multipliée par 1000. Notez que ceci inclut des secondes complÚtes.

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Résultat : 28500
      
minute

Le champ des minutes (0–59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 38
      
month

Le numĂ©ro du mois dans l'annĂ©e (1–12) ; pour les valeurs interval, le numĂ©ro du mois, modulo 12 (0–11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 2
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Résultat : 3
SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Résultat : 1
      
quarter

Le trimestre de l'annĂ©e (1–4) dans laquelle la date se trouve

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 1
      
second

Le champs secondes, incluant toutes secondes fractionnelles

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 40
SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Résultat : 28.5
      
timezone

Le décalage du fuseau horaire, à partir d'UTC, mesuré en secondes. Les valeurs positives correspondent aux fuseaux horaires à l'est d'UTC, les valeurs négatives aux zones à l'ouest d'UTC. (Techniquement, PostgreSQL n'utilise pas UTC parce que les secondes perdues ne sont pas gérées.)

timezone_hour

Le composant heure du décalage du fuseau horaire

timezone_minute

Le composant minute du décalage du fuseau horaire

week

Le numéro de la semaine de cette année d'aprÚs la numérotation de semaine de l'ISO 8601. Par définition, les semaines ISO commencent les lundis et la premiÚre semaine de l'année contient le 4 janvier de l'année. Autrement dit, le premier jeudi d'une année est dans la semaine 1 de cette année.

Dans le systÚme ISO de numérotation des semaines, il est possible que les dates de début janvier soient dans la semaine 52 ou 53 de l'année précédente, et pour les dates de fin décembre de faire partie de la premiÚre semaine de l'année suivante. Par exemple, le 1er janvier 2005 fait partie de la semaine 53 de l'année 2004, et le 1er janvier 2006 fait partie de la semaine 52 de l'année 2005, alors que le 31 décembre 2012 fait partie de la premiÚre semaine de 2013. Il est recommandé d'utiliser le champ isoyear avec week pour obtenir des résultats cohérents.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 7
      
year

Le champ annĂ©e. Gardez en tĂȘte qu'il n'existe pas d'annĂ©e 0 AD, donc soustraire BC annĂ©es de AD annĂ©es doit se faire avec prudence.

SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Résultat : 2001
      

Lors du traitement d'une valeur interval, la fonction extract produit des valeurs de champ qui correspondent Ă  l'interprĂ©tation utilisĂ©e par la fonction interval en sortie. Ceci peut produire des rĂ©sultats surprenants si l'une commence avec une reprĂ©sentation d'interval non normalisĂ©. Par exemple :

SELECT INTERVAL '80 minutes';
Résultat : 01:20:00
SELECT EXTRACT(MINUTES FROM INTERVAL '80 minutes');
Résultat : 20

Note

Quand la valeur en entrée est +/-Infinity, extract renvoie +/-Infinity pour les champs à augmentation monotonique (epoch, julian, year, isoyear, decade, century et millennium). Pour les autres champs, NULL est renvoyé. Les versions de PostgreSQL avant la 9.6 renvoyaient zéro pour tous les cas si l'entrée est infinie.

La fonction extract a principalement pour intĂ©rĂȘt un traitement calculĂ©. Pour le formatage de valeurs date/heure en vue d'un affichage, voir Section 9.8.

La fonction date_part est modelĂ©e sur l'Ă©quivalent traditionnel d'Ingres pour la fonction extract du standard SQL :

date_part('field', source)
   

Notez qu'ici le paramĂštre field doit ĂȘtre une chaĂźne, et non pas un nom. Les noms de champs valides pour date_part sont les mĂȘmes que pour extract.

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Résultat : 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Résultat : 4
  

9.9.2. date_trunc

La fonction date_trunc est conceptuellement similaire Ă  la fonction trunc pour les nombres.

date_trunc(field, source [, time_zone ])
   

source est une expression de valeur de type timestamp, timestamp with time zone ou interval. (Les valeurs de type date et time sont converties automatiquement, et respectivement, en timestamp ou interval) field sélectionne la précision pour le troncage de la valeur en entrée. La valeur de retour est de type timestamp, timestamp with time zone ou interval, et elle contient tous les champs qui sont moins significatifs que le champ sélectionné, qui est initialisé à zéro (ou un pour le jour et le mois).

Les valeurs valides pour field sont :

microseconds
milliseconds
second
minute
hour
day
week
month
quarter
year
decade
century
millennium

Quand la valeur en entrĂ©e est de type timestamp with time zone, la troncature est rĂ©alisĂ©e en respectant un fuseau horaire particulier ; par exemple, la troncature Ă  day crĂ©e une valeur Ă  minuit de ce fuseau. Par dĂ©faut, une troncature se fait en respectant le paramĂštre TimeZone mais l'argument optionnel time_zone peut ĂȘtre fourni pour indiquer un fuseau horaire diffĂ©rent. Le nom du fuseau horaire peut ĂȘtre indiquĂ© parmi toutes les façons dĂ©crites dans Section 8.5.3.

Un fuseau horaire ne peut pas ĂȘtre indiquĂ© lors du traitement de donnĂ©es timestamp without time zone ou interval. Ce sont toujours des valeurs prises directement, sans interprĂ©tation.

Exemples (en supposant que le fuseau horaire local est America/New_York) :

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Résultat : 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Résultat : 2001-01-01 00:00:00
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00');
Résultat : 2001-02-16 00:00:00-05
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00', 'Australia/Sydney');
Résultat : 2001-02-16 08:00:00-05
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');
Résultat : 3 days 02:00:00
   

9.9.3. AT TIME ZONE

L'opĂ©rateur AT TIME ZONE convertit l'horodatage sans sans fuseau horaire en horodatage avec fuseau horaire, et des valeurs time with time zone dans diffĂ©rents fuseaux horaires. Tableau 9.33 montre les variantes.

Tableau 9.33. Variantes AT TIME ZONE

Opérateur

Description

Exemple(s)

timestamp without time zone AT TIME ZONE zone → timestamp with time zone

Convertit l'horodatage donné sans fuseau horaire en horodatage avec fuseau horaire en supposant que la valeur indiquée est dans le fuseau horaire nommé.

timestamp '2001-02-16 20:38:40' at time zone 'America/Denver' → 2001-02-17 03:38:40+00

timestamp with time zone AT TIME ZONE zone → timestamp without time zone

Convertit l'horodatage donné avec fuseau horaire en horodatage sans sans fuseau horaire, comme si l'heure apparaissait dans ce fuseau.

timestamp with time zone '2001-02-16 20:38:40-05' at time zone 'America/Denver' → 2001-02-16 18:38:40

time with time zone AT TIME ZONE zone → time with time zone

Convertit l'heure donnée avec fuseau horaire dans un nouveau fuseau horaire. Comme aucune date n'est fournie, cela utilise le décalage UTC actuellement actif pour le fuseau horaire de destination.

time with time zone '05:34:17-05' at time zone 'UTC' → 10:34:17+00


Dans ces expressions, le fuseau horaire dĂ©sirĂ© zone peut ĂȘtre spĂ©cifiĂ© soit sous la forme d'une valeur de type texte (par exemple 'America/Los_Angeles') soit comme un intervalle (par exemple INTERVAL '-08:00'). Dans le cas du texte, le nom du fuseau horaire peut ĂȘtre indiquĂ© d'une des façons dĂ©crites dans Section 8.5.3. Dans le cas de l'intervalle, il est uniquement utile pour les fuseaux qui ont des dĂ©calages fixes d'UTC, donc ce n'est pas trĂšs courant.

Exemples (en supposant que le paramĂštre TimeZone a comme valeur actuelle America/Los_Angeles) :

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver';
Résultat : 2001-02-16 19:38:40-08
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver';
Résultat : 2001-02-16 18:38:40
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago';
Résultat : 2001-02-16 05:38:40
   

Le premier exemple ajoute un fuseau horaire à une valeur qui en manque, et affiche la valeur en utilisant le paramétrage actuel de TimeZone. Le deuxiÚme exemple décale l'horodatage avec fuseau horaire dans le fuseau horaire indiqué, et envoie la valeur sans fuseau horaire. Ceci permet le stockage et l'affichage de valeurs différentes de la configuration actuelle de TimeZone. Le troisiÚme exemple convertit l'heure de Tokyo en heure de Chicago.

La fonction timezone(zone, timestamp) est équivalente à la construction conforme au standard SQL timestamp AT TIME ZONE zone.

9.9.4. Date/Heure actuelle

PostgreSQL fournit un certain nombre de fonctions qui renvoient des valeurs relatives Ă  la date et l'heure actuelles. Ces fonctions SQL renvoient des valeurs basĂ©es sur l'heure de dĂ©but de la transaction :

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)
   

CURRENT_TIME et CURRENT_TIMESTAMP renvoient des valeurs avec fuseau horaire ; LOCALTIME et LOCALTIMESTAMP renvoient des valeurs sans fuseau horaire.

CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME et LOCALTIMESTAMP peuvent prendre en option un paramÚtre de précision qui impose que le résultat soit arrondi à ce nombre de chiffres dans le champ des secondes. Sans paramÚtre de précision, le résultat est donné avec toute la précision disponible.

Quelques exemples :

SELECT CURRENT_TIME;
Résultat : 14:39:53.662522-05
SELECT CURRENT_DATE;
Résultat : 2019-12-23
SELECT CURRENT_TIMESTAMP;
Résultat : 2019-12-23 14:39:53.662522-05
SELECT CURRENT_TIMESTAMP(2);
Résultat : 2019-12-23 14:39:53.66-05
SELECT LOCALTIMESTAMP;
Résultat : 2019-12-23 14:39:53.662522
   

Comme ces fonctions renvoient l'heure du dĂ©but de la transaction en cours, leurs valeurs ne changent pas lors de la transaction courante. Ceci est considĂ©rĂ© comme une fonctionnalitĂ© : le but est de permettre Ă  une mĂȘme transaction d'avoir une notion cohĂ©rente de l'heure « actuelle Â», pour que plusieurs modifications au sein de la mĂȘme transactions arrivent au mĂȘme moment grĂące Ă  un mĂȘme horodatage.

Note

D'autres systÚmes de bases de données pourraient mettre à jour ces valeurs plus fréquemment.

PostgreSQL fournit aussi des fonctions qui renvoient l'heure de dĂ©but de la requĂȘte en cours, ainsi que l'heure actuelle au moment oĂč la fonction est appelĂ©e. La liste complĂšte des fonctions d'heure, ne faisant pas parti du standard SQL, est la suivante :

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()
   

transaction_timestamp() est Ă©quivalent Ă  CURRENT_TIMESTAMP, mais est nommĂ©e ainsi pour reflĂ©ter clairement ce qu'il renvoie. statement_timestamp() renvoie l'heure de dĂ©but de la requĂȘte en cours (plus spĂ©cifiquement, l'heure de rĂ©ception du dernier message de commande du client). statement_timestamp() et transaction_timestamp() renvoient la mĂȘme valeur lors de la premiĂšre requĂȘte d'une transaction, mais pourrait diffĂ©rer lors des requĂȘtes suivantes. clock_timestamp() renvoie l'heure actuelle, et de ce fait, sa valeur changera y compris au sein d'une mĂȘme requĂȘte SQL. timeofday() est une fonction historique de PostgreSQL. Tout comme clock_timestamp(), elle renvoie l'heure actuelle, mais formatĂ©e sous la forme d'une chaĂźne de type text plutĂŽt que sous la forme d'une valeur de type timestamp with time zone. now() est un Ă©quivalent historique de PostgreSQL pour transaction_timestamp().

Tous les types de donnĂ©es date/heure acceptent aussi la valeur littĂ©rale spĂ©ciale now pour indiquer la date et l'heure actuelle (encore une fois, interprĂ©tĂ© comme l'heure de dĂ©but de la transaction). De ce fait, les trois suivants renvoient tous le mĂȘme rĂ©sultat :

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now'; -- mais voir l'astuce ci-dessous
   

Astuce

Ne pas utiliser la troisiĂšme forme lors de la spĂ©cification d'une valeur Ă  Ă©valuer ultĂ©rieurement, par exemple dans une clause DEFAULT de la colonne d'une table. Le systĂšme convertirait now en valeur de type timestamp dĂšs l'analyse de la constante. À chaque fois que la valeur par dĂ©faut est nĂ©cessaire, c'est l'heure de crĂ©ation de la table qui est alors utilisĂ©e. Les deux premiĂšres formes ne sont pas Ă©valuĂ©es avant l'utilisation de la valeur par dĂ©faut, il s'agit d'appels de fonctions. C'est donc bien le comportement attendu, l'heure d'insertion comme valeur par dĂ©faut, qui est obtenu. (Voir aussi Section 8.5.1.4.)

9.9.5. Retarder l'exĂ©cution

Les fonctions suivants sont disponibles pour retarder l'exĂ©cution du traitement du serveur :

pg_sleep ( double precision )
pg_sleep_for ( interval )
pg_sleep_until ( timestamp with time zone )
   

pg_sleep cause la pause du processus de la session en cours pour le nombre indiquĂ© de secondes. Un dĂ©lai peut ĂȘtre spĂ©cifiĂ© avec une partie fractionnelle pour les secondes pg_sleep_for est une fonction pratique pour indiquer le temps de pause sous la forme d'un interval. pg_sleep_until est une autre fonction pratique pour indiquer une heure de rĂ©veil, Ă  la place d'une durĂ©e de pause. Par exemple :

SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
   

Note

La rĂ©solution rĂ©elle de l'intervalle de pause est spĂ©cifique Ă  la plateforme ; 0,01 secondes est une valeur assez gĂ©nĂ©rale. La durĂ©e de pause sera au moins aussi longue que celle indiquĂ©e. Elle pourra ĂȘtre plus longue suivant des facteurs comme la charge du serveur. En particulier, pg_sleep_until ne garantie pas de se rĂ©veiller prĂ©cisĂ©ment Ă  l'heure indiquĂ©e, mais elle ne se rĂ©veillera pas avant.

Avertissement

Assurez-vous que votre session ne détient pas plus de verrous que nécessaire lors de l'appel de pg_sleep ou une de ses variantes. Sinon, d'autres sessions pourraient avoir à attendre le processus en attente, ralentissant le systÚme entier.