9.8. Fonctions de formatage des types de données

Les fonctions de formatage de PostgreSQL™ fournissent un ensemble d'outils puissants pour convertir différent types de données (date/heure, entier, nombre à virgule flottante, numérique) en des chaînes formatées et pour convertir des chaînes formatées en des types de données spécifiques. Le Tableau 9.20, « Fonctions de formatage » les liste. Ces fonctions suivent toute une convention d'appels commune : le premier argument est la valeur à formater et le second argument est un modèle définissant le format de sortie ou d'entrée.

La fonction to_timestamp peut aussi prendre un simple argument double precision pour convertir une valeur du type epoch Unix en timestamp with time zone (les types epoch Unix (entier) sont implicitement convertis en double precision).

Tableau 9.20. Fonctions de formatage

Fonction Type en retour Description Exemple
to_char(timestamp, text) text convertit un champ de type timestamp en une chaîne to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text) text convertit un champ de type interval en une chaîne to_char(interval '15h 2m 12s', 'HH24:MI:SS')
to_char(int, text) text convertit un champ de type integer en une chaîne to_char(125, '999')
to_char(double precision, text) text convertit un champ de type real/double precision en une chaîne to_char(125.8::real, '999D9')
to_char(numeric, text) text convertit un champ de type numeric en une chaîne to_char(-125.8, '999D99S')
to_date(text, text) date convertit une chaîne en date to_date('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(text, text) timestamp with time zone convertit une chaîne string en un champ de type timestamp to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(double precision) timestamp with time zone convertit une valeur de type epoch UNIX en une valeur de type timestamp to_timestamp(200120400)
to_number(text, text) numeric convertit une chaîne en champ de type numeric to_number('12,454.8-', '99G999D9S')

Dans une chaîne modèle en sortie (pour to_char), certains modèles sont reconnus et remplacés avec les données proprement formatées à partir de la valeur à formater. Tout texte qui n'est pas un modèle est copié sans modification. De même, sur une chaîne modèle en entrée (pour tout sauf to_char), les modèles identifient les parties de la chaîne en entrée à récupérer et les valeurs à trouver.

Le Tableau 9.21, « Modèles pour le formatage de champs de type date/heure » affiche les modèles disponibles pour formater les valeurs de types date et heure.

Tableau 9.21. Modèles pour le formatage de champs de type date/heure

Modèle Description
HH heure du jour (01-12)
HH12 heure du jour (01-12)
HH24 heure du jour (00-23)
MI minute (00-59)
SS seconde (00-59)
MS milliseconde (000-999)
US microseconde (000000-999999)
SSSS secondes passées depuis minuit (0-86399)
AM ou A.M. ou PM ou P.M. indicateur du méridien (en majuscule)
am ou a.m. ou pm ou p.m. indicateur du méridien (en minuscule)
Y,YYY année (quatre chiffres et plus) avec virgule
YYYY année (quatre chiffres et plus)
YYY trois derniers chiffres de l'année
YY deux derniers chiffres de l'année
Y dernier chiffre de l'année
IYYY année ISO (quatre chiffres ou plus)
IYY trois derniers chiffres de l'année ISO
IY deux derniers chiffres de l'année ISO
I dernier chiffre de l'année ISO
BC ou B.C. ou AD ou A.D. indicateur de l'ère (majuscule)
bc ou b.c. ou ad ou a.d. indicateur de l'ère (minuscule)
MONTH nom complet du mois en majuscule (espaces ajoutés pour arriver à neuf caractères)
Month nom complet du mois (espaces ajoutés pour arriver à neuf caractères)
month nom complet du mois en minuscule (espaces ajoutés pour arriver à neuf caractères)
MON abréviation du nom du mois en majuscule (trois caractères)
Mon abréviation du nom du mois (trois caractères)
mon abréviation du nom du mois en minuscule (trois caractères)
MM numéro du mois (01-12)
DAY nom complet du jour en majuscule (espaces ajoutés pour arriver à neuf caractères)
Day nom complet du jour (espaces ajoutés pour arriver à neuf caractères)
day nom complet du jour en minuscule (espaces ajoutés pour arriver à neuf caractères)
DY abréviation du nom du jour en majuscule (trois caractères)
Dy abréviation du nom du jour (trois caractères)
dy abréviation du nom du jour en minuscule (trois caractères)
DDD jour de l'année (001-366)
DD jour du mois (01-31)
D jour de la semaine (de 1 à 7, dimanche étant le 1)
W numéro de semaine du mois, de 1 à 5 (la première semaine commence le premier jour du mois)
WW numéro de semaine dans l'année, de 1 à 53 (la première semaine commence le premier jour de l'année)
IW numéro de semaine ISO de l'année (le premier jeudi de la nouvelle année correspond à la semaine 1)
CC siècle (deux chiffres)
J Julian Day (nombre de jours depuis le 1er janvier 4712 avant JC)
Q trimestre
RM mois en nombre romain (I-XII ; I étant janvier) (en majuscule)
rm mois en nombre romain (i-xii; i étant janvier) (en minuscule)
TZ nom du fuseau horaire (en majuscule)
tz nom du fuseau horaire (en minuscule)

Certains modificateurs peuvent être appliqués à tout modèle pour changer leur comportement. Par exemple, FMMonth est le modèle Month avec le modificateur FM. Le Tableau 9.22, « Modificateurs de modèles pour le formatage des dates/heures » affiche les modificateurs de modèles pour le formatage des dates/heures.

Tableau 9.22. Modificateurs de modèles pour le formatage des dates/heures

Modificateur Description Exemple
préfixe FM mode remplissage (supprime les espaces et les zéros) FMMonth
suffixe TH suffixe du nombre ordinal en majuscule DDTH
suffixe th suffixe du nombre ordinal en minuscule DDth
préfixe FX option global de format fixé (voir les notes d'utilisation) FX Month DD Day
suffixe SP mode épelé (pas encore implémenté) DDSP

Notes d'utilisation pour le formatage date/heure :

Le Tableau 9.23, « Modèles pour le formatage de valeurs numériques » affiche les modèles disponibles pour le formatage des valeurs numériques.

Tableau 9.23. Modèles pour le formatage de valeurs numériques

Modèle Description
9 valeur avec le nombre spécifié de chiffres
0 valeur avec des zéros de remplissage
. (point) point décimal
, (virgule) séparateur de groupe (milliers)
PR valeur négative entre crochets
S signe accroché au nombre (utilise la locale)
L symbole monétaire (utilise la locale)
D point décimal (utilise la locale)
G séparateur de groupe (utilise la locale)
MI signe moins dans la position spécifiée (si le nombre est inférieur à 0)
PL signe plus dans la position spécifiée (si le nombre est supérieur à 0)
SG signe plus/moins dans la position spécifiée
RN numéro romain (entrée entre 1 et 3999)
TH ou th suffixe du nombre ordinal
V décalage d'un nombre spécifié de chiffres (voir les notes)
EEEE notation scientifique (pas encore implémentée)

Notes d'utilisation pour le formatage des nombres :

Le Tableau 9.24, « Exemples avec to_char » affiche quelques exemples de l'utilisation de la fonction to_char.

Tableau 9.24. Exemples avec to_char

Expression Résultat
to_char(current_timestamp, 'Day, DD HH12:MI:SS') 'Tuesday , 06 05:39:18'
to_char(current_timestamp, 'FMDay, FMDD HH12:MI:SS') 'Tuesday, 6 05:39:18'
to_char(-0.1, '99.99') ' -.10'
to_char(-0.1, 'FM9.99') '-.1'
to_char(0.1, '0.9') ' 0.1'
to_char(12, '9990999.9') ' 0012.0'
to_char(12, 'FM9990999.9') '0012.'
to_char(485, '999') ' 485'
to_char(-485, '999') '-485'
to_char(485, '9 9 9') ' 4 8 5'
to_char(1485, '9,999') ' 1,485'
to_char(1485, '9G999') ' 1 485'
to_char(148.5, '999.999') ' 148.500'
to_char(148.5, 'FM999.999') '148.5'
to_char(148.5, 'FM999.990') '148.500'
to_char(148.5, '999D999') ' 148,500'
to_char(3148.5, '9G999D999') ' 3 148,500'
to_char(-485, '999S') '485-'
to_char(-485, '999MI') '485-'
to_char(485, '999MI') '485 '
to_char(485, 'FM999MI') '485'
to_char(485, 'PL999') '+485'
to_char(485, 'SG999') '+485'
to_char(-485, 'SG999') '-485'
to_char(-485, '9SG99') '4-85'
to_char(-485, '999PR') '<485>'
to_char(485, 'L999') 'DM 485
to_char(485, 'RN') ' CDLXXXV'
to_char(485, 'FMRN') 'CDLXXXV'
to_char(5.2, 'FMRN') 'V'
to_char(482, '999th') ' 482nd'
to_char(485, '"Good number:"999') 'Good number: 485'
to_char(485.8, '"Pre:"999" Post:" .999') 'Pre: 485 Post: .800'
to_char(12, '99V999') ' 12000'
to_char(12.4, '99V999') ' 12400'
to_char(12.45, '99V9') ' 125'