Fonctions et opérateurs date/time

La Table 17 montre les fonctions disponibles pour le traitement des valeurs date/time. La Table 16illustre les comportements des opérateurs arithmétiques basiques (+, *, etc.). Pour les fonctions de formatage voir the section called Fonctions de formatage de type. Vous devriez être familiers avec avec les types date/time (voir the section called Types Date/Time in the chapter called Types).

Les opérateurs date/time décrits ci-dessous ont un comportement similaire aux types time zones.

Table 16. Opérateurs Date/Time

NomExempleRésultat
+ timestamp '2001-09-28 01:00' + interval '23 hours'timestamp '2001-09-29 00:00'
+ date '2001-09-28' + interval '1 hour'timestamp '2001-09-28 01:00'
+ time '01:00' + interval '3 hours'time '04:00'
- timestamp '2001-09-28 23:00' - interval '23 hours'timestamp '2001-09-28'
- date '2001-09-28' - interval '1 hour'timestamp '2001-09-27 23:00'
- time '05:00' - interval '2 hours'time '03:00'
- interval '2 hours' - time '05:00'time '03:00:00'
* interval '1 hour' * int '3'interval '03:00'
/ interval '1 hour' / int '3'interval '00:20'

Les fonctions date/time sont résumées ci-dessous, avec des détails supplémentaires.

Table 17. Fonctions Date/Time

NomRetourDescriptionExempleRésultat
age(timestamp)intervalSubtract from todayage(timestamp '1957-06-13')43 years 8 mons 3 days
age(timestamp, timestamp)intervalSubtract argumentsage('2001-04-10', timestamp '1957-06-13')43 years 9 mons 27 days
current_datedateToday's date; see below   
current_timetimeTime of day; see below   
current_timestamptimestampDate and time; see below   
date_part(text, timestamp)double precisionGet subfield (equivalent to extract); see also below date_part('hour', timestamp '2001-02-16 20:38:40')20
date_part(text, interval)double precisionGet subfield (equivalent to extract); see also below date_part('month', interval '2 years 3 months')3
date_trunc(text, timestamp)timestampTruncate to specified precision; see also below date_trunc('hour', timestamp '2001-02-16 20:38:40')2001-02-16 20:00:00+00
extract(field from timestamp)double precisionGet subfield; see also below extract(hour from timestamp '2001-02-16 20:38:40')20
extract(field from interval)double precisionGet subfield; see also below extract(month from interval '2 years 3 months')3
isfinite(timestamp)booleanTest for finite time stamp (neither invalid nor infinity)isfinite(timestamp '2001-02-16 21:28:30')true
isfinite(interval)booleanTest for finite intervalisfinite(interval '4 hours')true
now()timestampCurrent date and time (equivalent to current_timestamp); see below   
timeofday()textCurrent date and time; see below timeofday()Wed Feb 21 17:01:13.000126 2001 EST
timestamp(date)timestampdate to timestamptimestamp(date '2000-12-25')2000-12-25 00:00:00
timestamp(date, time)timestampdate and time to timestamptimestamp(date '1998-02-24',time '23:07')1998-02-24 23:07:00

EXTRACT, date_part

EXTRACT (field FROM source)

La fonction extract retrouve les sous-champs des valeurs date/time, comme l'année ou l'heure. source est une expression de valeur qui s'évalue aux types timestamp ou interval. (Les expressions de type date ou time seront forcées en timestamp et peuvent être utilisées de cette façon.) field est un identifiant ou une chaîne qui sélectionne quel champ à extraire d'une valeur source. La fonction extract renvoit des valeurs de type double precision. Les valeurs suivantes sont valides :

century

Le champ année divisé par 100

SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

Notez que le résultat du champ century est simplement le champ année divisé par 100, et pas la définition conventionnelle du vingtième siècle.

day

Le champ jour (du mois), (1 - 31)

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 16

decade

Le champ année divisé par 10

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 200

dow

Le jour de la semaine (0 - 6; dimanche est 0) (pour les valeurs timestamp uniquement)

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

doy

Le jour de l'année (1 - 365/366) (pour les valeurs timestamp uniquement)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 47

epoch

Pour les valeurs date et timestamp, le nombre de secondes depuis le 01.01.1970 à 00:00:00-00 (le résultat peut être négatif); pour les valeurs interval, le nombre total de secondes dans interval.

SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 982352320

SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Result: 442800

hour

Le champ heure (0 - 23)

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

microseconds

Le champ secondes, incluant les fractions multiplié par 1 000 000. Notez que ceci inclut les secondes pleines.

SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Result: 28500000

millennium

Le champ année divisé par 1000

SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

Notez que le résultat du champ millenium est simplement le champ année divisé par 1000, et pas la définition conventionnelle qui place les années dans le second millénaire.

milliseconds

Le champ secondes, incluant les fractions, multiplié par 1000. Notez que ceci inclut les secondes pleines.

SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Result: 28500

minute

Le champ minutes (0 - 59)

SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 38

month

Pour les valeurs timestamp, le numéro du mois dans l'année (1 - 12) ; pour les valeurs interval le numéro des mois, modulo 12 (0 - 11)

SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 2

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
Result: 3

SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
Result: 1

quarter

Le trimestre de l'année (1 - 4) dans lequel se trouve le jour (pour les valeurs timestamp uniquement)

SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 1

second

Le champ seconde, incluent les fractions (0 - 59[1])

SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 40

SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Result: 28.5

timezone_hour

Le composant heure de la zone horaire.

timezone_minute

Le composant minute de la zone horaire.

week

Depuis une valeur timestamp, calcule le nombre de semaines de l'année dans laquelle se trouve le jour. Par définition (ISO 8601), la première semaine d'une année contient le 4 janvier de cette année. (La semaine ISO démarre un lundi). En d'autres termes, le premier jeudi de l'année est dans la semaine 1 de cette année.

SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 7

year

Le champ année

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

La première intention de la fonction extract est le processus de calcul. Pour le formatage des valeurs date/time pour l'affichage, voir the section called Fonctions de formatage de type.

La fonction date_part est modelée sur Ingres équivalent à la fonction SQL extract:

date_part('field', source)
Notez qu'ici les valeurs field nécessitent d'être sous forme de chaîne. Les valeurs de champ valide pour date_part sont les mêmes que pour extract.

SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Result: 16

SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Result: 4

date_trunc

La fonction date_truncest d'un concept similaire à la fonction trunc pour les nombres.

date_trunc('field', source)
source est une expression de valeur de type timestamp (les valeurs de type date et time sont automatiquement forcées). field sélectionne la précision pour tronquer la valeur time stamp. La valeur de retour est de type timestamp avec tous les champs qui sont inférieurs à la valeur sélectionnée placée à zero (ou un, pour les jours et les mois).

Les valeurs correctes pour field sont :

microseconds
milliseconds
second
minute
hour
day
month
year
decade
century
millennium

SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-02-16 20:00:00+00

SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Result: 2001-01-01 00:00:00+00

Date/Time courants

Les fonctions suivantes sont disponibles pour obtenir la date et l'heure courantes :

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME ( precision )
CURRENT_TIMESTAMP ( precision )
CURRENT_TIME et CURRENT_TIMESTAMP peuvent optionnellement être fournis, comme paramètre de précision, ce qui produira un résultat arrondi pour plusieurs chiffres fractionnés. Sans paramètre de précision, le résultat est donné en précision pleine.

Note

Avant PostgreSQL 7.2, les paramètres de précision n'étaient pas implémentés, et le résultat toujours affiché en secondes pleines.

Note

Le standard SQL99 nécessite que ces fonctions soient écrites sans aucune parenthèse, sauf si un paramètre de précision est donné. Dans PostgreSQL 7.2, deux parenthèses vides peuvent être écrites, mais c'est déconseillé et pourra être supprimé dans les prochaines versions.

SELECT CURRENT_TIME;
14:39:53.662522-05

SELECT CURRENT_DATE;
2001-12-23

SELECT CURRENT_TIMESTAMP;
2001-12-23 14:39:53.662522-05

SELECT CURRENT_TIMESTAMP(2);
2001-12-23 14:39:53.66-05

La fonction now() est l'équivalent PostgreSQL de CURRENT_TIMESTAMP.

Il existe aussi timeofday(), qui pour des raisons historiques renvoit une chaîne texte plutôt qu'une valeur timestamp :

SELECT timeofday();
 Sat Feb 17 19:07:32.000126 2001 EST

Il est important de comprendre que CURRENT_TIMESTAMP et ses diverses fonctions renvoient toutes l'heure du début de la transaction; leurs valeurs ne s'incrémentent pas tandis qu'une transaction est en cours. Mais timeofday() renvoit l'heure courante.

Tous les types date/time acceptent aussi la valeur spéciale now pour spécifier le date et l'heure courantes. Ainsi, les trois suivantes afficheront toutes le même résultat.

SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now';

Note

Vous n'utiliserez pas la troisième forme quand vous spécifiez une valeur DEFAULT lors de la création d'une table. Le système convertira now en timestamp dès que la constante est analysée, ainsi que lorsque la valeur par défaut est nécessaire, l'heure de la création de la table sera utilisée ! Les deux premières formes ne seront pas évaluées jusqu'à ce que la valeur par défaut soit utilisée, car elles représentent des appels fonction. Ainsi elle fourniront le comportement attendu pour l'heure par défaut de l'insertion de la ligne.

Notes

[1]

60 si les secondes sautées sont implémentées dans le système d'exploitation