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érents types de données
(date/heure, entier, nombre à virgule flottante, numérique) en
chaînes formatées et pour convertir des chaînes formatées en types de
données spécifiques. Le Tableau 9.20,
« Fonctions de formatage » les liste. Ces fonctions
suivent toutes une même convention d'appel : 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 argument double precision unique pour
convertir une valeur de 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 chaîne
|
to_char(current_timestamp,
'HH12:MI:SS')
|
|
to_char(interval,
text)
|
text
|
convertit un champ de type interval en chaîne
|
to_char(interval '15h 2m 12s',
'HH24:MI:SS')
|
|
to_char(int,
text)
|
text
|
convertit un champ de type integer en chaîne
|
to_char(125, '999')
|
|
to_char(double
precision, text)
|
text
|
convertit un champ de type real/double precision en chaîne
|
to_char(125.8::real, '999D9')
|
|
to_char(numeric,
text)
|
text
|
convertit un champ de type numeric en 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_number(text,
text)
|
numeric
|
convertit une chaîne en champ de type numeric
|
to_number('12,454.8-',
'99G999D9S')
|
|
to_timestamp(text, text)
|
timestamp with time zone
|
convertit une chaîne string en 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 valeur de type
timestamp
|
to_timestamp(200120400)
|
Dans une chaîne de modèle de sortie (pour to_char), certains modèles sont reconnus et remplacés
par des données proprement formatées issues de la valeur à formater.
Tout texte qui n'est pas un motif du modèle est copié sans
modification. De même, dans une chaîne de modèle d'entrée (pour tout
sauf to_char), les motifs du modèle
identifient les parties de la chaîne en entrée à rechercher et les
valeurs à trouver.
Le
Tableau 9.21, « Modèles pour le formatage de champs de type
date/heure » affiche les motifs 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 écoulées depuis minuit (0-86399)
|
|
AM ou A.M. ou PM ou
P.M.
|
indicateur du méridien (en majuscules)
|
|
am ou a.m. ou pm ou
p.m.
|
indicateur du méridien (en minuscules)
|
|
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 (en majuscules)
|
|
bc ou b.c. ou ad ou
a.d.
|
indicateur de l'ère (en minuscules)
|
|
MONTH
|
nom complet du mois en majuscules (espaces de complètement
pour arriver à neuf caractères)
|
|
Month
|
nom complet du mois en casse mixte (espaces de complètement
pour arriver à neuf caractères)
|
|
month
|
nom complet du mois en minuscules (espaces de complètement
pour arriver à neuf caractères)
|
|
MON
|
abréviation du nom du mois en majuscules (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
Mon
|
abréviation du nom du mois en casse mixte (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
mon
|
abréviation du nom du mois en minuscules (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
MM
|
numéro du mois (01-12)
|
|
DAY
|
nom complet du jour en majuscules (espaces de complètement
pour arriver à neuf caractères)
|
|
Day
|
nom complet du jour en casse mixte (espaces de complètement
pour arriver à neuf caractères)
|
|
day
|
nom complet du jour en minuscules (espaces de complètement
pour arriver à neuf caractères)
|
|
DY
|
abréviation du nom du jour en majuscules (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
Dy
|
abréviation du nom du jour en casse mixte (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
dy
|
abréviation du nom du jour en minuscules (trois caractères
en anglais, la longueur des versions localisées peut
varier)
|
|
DDD
|
jour de l'année (001-366)
|
|
DD
|
jour du mois (01-31)
|
|
D
|
jour de la semaine (de 1 à 7, dimanche étant numéroté 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 la semaine dans l'année, de 1 à 53 (la première
semaine commence le premier jour de l'année)
|
|
IW
|
numéro ISO de la semaine dans l'année (le premier jeudi de
la nouvelle année est dans la semaine 1)
|
|
CC
|
siècle (deux chiffres) (le 21è siècle commence le 1er
janvier 2001)
|
|
J
|
Jour dans le calendrier Julien (nombre de jours depuis le
1er janvier 4712 avant JC)
|
|
Q
|
trimestre
|
|
RM
|
mois en nombre romain (I-XII ; I étant janvier) (en
majuscules)
|
|
rm
|
mois en nombre romain (i-xii; i étant janvier) (en
minuscules)
|
|
TZ
|
nom du fuseau horaire (en majuscules)
|
|
tz
|
nom du fuseau horaire (en minuscules)
|
Certains modificateurs peuvent être appliqués à tous les motifs pour
en changer le comportement. Par exemple, FMMonth est le motif Month
avec le modificateur FM. Le
Tableau 9.22, « Modificateurs de motifs pour le formatage
des dates/heures » affiche les modificateurs de motifs pour
le formatage des dates/heures.
Tableau 9.22. Modificateurs de motifs pour le
formatage des dates/heures
|
Modificateur
|
Description
|
Exemple
|
|
préfixe FM
|
mode remplissage (
Fill Mode
) (supprime les
espaces et les zéros)
|
FMMonth
|
|
suffixe TH
|
suffixe du nombre ordinal en majuscules
|
DDTH
|
|
suffixe th
|
suffixe du nombre ordinal en minuscules
|
DDth
|
|
préfixe FX
|
option globale de format fixe (voir les notes
d'utilisation)
|
FX Month DD Day
|
|
préfixe TM
|
mode de traduction (affiche les noms des jours et mois
localisés en fonction de lc_messages)
|
TMMonth
|
|
suffixe SP
|
mode épelé (
Spell Mode
) (pas encore
implanté)
|
DDSP
|
Notes d'utilisation pour le formatage date/heure :
-
FM supprime les zéros de début et les
espaces de fin qui, autrement, sont ajoutés pour fixer la
taille du motif de sortie ;
-
TM n'inclut pas d'espaces en fin de
chaîne ;
-
to_timestamp et to_date ignorent les espaces multiples de la
chaîne en entrée si l'option FX n'est
pas utilisée. FX doit être indiqué
comme premier élément du modèle. Par exemple, to_timestamp('2000 JUN', 'YYYY MON') est correct
mais to_timestamp('2000 JUN', 'FXYYYY
MON') renvoie une erreur car to_timestamp n'attend qu'une seule espace ;
-
il est possible d'insérer du texte ordinaire dans les modèles
to_char. il est alors littéralement
remis en sortie. Une sous-chaîne peut être placée entre
guillemets doubles pour forcer son interprétation en tant que
libellé même si elle contient des mots clés de motif. Par
exemple, dans '"Hello Year "YYYY', les
caractères YYYY sont remplacés par
l'année mais l'Y isolé du mot
Year ne l'est pas ;
-
pour afficher un guillemet double dans la sortie, il faut le
faire précéder d'un antislash. E'\\"YYYY
Month\\"', par exemple (deux antislashs sont nécessaire
parce que l'antislash a déjà une signification spéciale lors de
l'utilisation de la syntaxe d'échappement des chaînes) ;
-
la conversion YYYY d'une chaîne en
champ de type timestamp ou
date comporte une restriction avec
les années à plus de quatre chiffres. Il faut alors utiliser un
modèle ou un caractère non-numérique après YYYY, sans quoi l'année est toujours interprétée
sur quatre chiffres. Par exemple, pour l'année 20000 :
to_date('200001131', 'YYYYMMDD') est
interprété comme une année à quatre chiffres ; il faut alors
utiliser un séparateur non décimal après l'année comme
to_date('20000-1131', 'YYYY-MMDD') ou
to_date('20000Nov31', 'YYYYMonDD') ;
-
dans les conversions de chaîne en timestamp ou date, le
champ CC est ignoré s'il y a un champ
YYY, YYYY ou
Y,YYY. Si CC
est utilisé avec YY ou Y, alors l'année est calculée comme (CC-1)*100+YY ;
-
les valeurs en millisecondes (MS) et
microsecondes (US) dans une conversion
de chaîne en champ de type timestamp
sont utilisées comme partie de la fraction décimale des
secondes. Par exemple, to_timestamp('12:3',
'SS:MS') n'est pas 3 millisecondes mais 300 car la
conversion le compte comme 12 + 0,3 secondes. Cela signifie que
pour le format SS:MS, les valeurs
d'entrée 12:3, 12:30 et 12:300
indiquent le même nombre de millisecondes. Pour obtenir trois
millisecondes, il faut écrire 12:003
que la conversion compte comme 12 + 0,003 = 12,003 secondes ;
Exemple plus complexe : to_timestamp('15:12:02.020.001230',
'HH:MI:SS.MS.US') représente 15 heures, 12 minutes et (2
secondes + 20 millisecondes + 1230 microsecondes =) 2,021230
secondes.
-
la numérotation du jour de la semaine de to_char (voir le modèle de formatage de 'D')
est différente de celle de la fonction extract ;
-
to_char(interval) formate HH et HH12 comme les
heures d'un seul jour alors que HH24
peut afficher des heures dépassant un simple jour, c'est-à-dire
>24.
Le
Tableau 9.23, « Motifs de modèle pour le formatage de
valeurs numériques » affiche les motifs de modèle
disponibles pour le formatage des valeurs numériques.
Tableau 9.23. Motifs de modèle pour le formatage de
valeurs numériques
|
Motif
|
Description
|
|
9
|
valeur avec le nombre indiqué de chiffres
|
|
0
|
valeur avec des zéros de remplissage avant
|
|
. (point)
|
point décimal
|
|
, (virgule)
|
séparateur de groupe (milliers)
|
|
PR
|
valeur négative entre chevrons
|
|
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 indiquée (si le nombre est
inférieur à 0)
|
|
PL
|
signe plus dans la position indiquée (si le nombre est
supérieur à 0)
|
|
SG
|
signe plus/moins dans la position indiquée
|
|
RN
|
numéro romain (entrée entre 1 et 3999)
|
|
TH ou th
|
suffixe du nombre ordinal
|
|
V
|
décalage du nombre indiqué de chiffres (voir les notes)
|
|
EEEE
|
notation scientifique (pas encore implantée)
|
Notes d'utilisation pour le formatage des nombres :
-
un signe formaté à l'aide de SG,
PL ou MI
n'est pas ancré au nombre ; par exemple, to_char(-12, 'S9999') produit ' -12' mais to_char(-12,
'MI9999') produit '- 12'.
L'implantation Oracle n'autorise pas l'utilisation de
MI devant 9,
mais requiert plutôt que 9 précède
MI ;
-
9 est transformé en valeur avec le
même nombre de chiffres qu'il y a de 9. Si un chiffre n'est pas
disponible, il est remplacé par une espace ;
-
TH ne convertit pas les valeurs
inférieures à zéro et ne convertit pas les nombres fractionnels
;
-
PL, SG et
TH sont des extensions PostgreSQL™ ;
-
V multiplie effectivement les valeurs
en entrée par 10^
n
, où
n
est le nombre de chiffres qui
suit V. to_char ne supporte pas l'utilisation de
V combiné avec un point décimal (donc
99.9V99 n'est pas autorisé).
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'
|
|