Documentation PostgreSQL 8.1.23 > Langage SQL > Fonctions et opérateurs > Fonctions de formatage des types de données | |
Correspondance de modèles | Fonctions et opérateurs pour date/heure |
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 :
FM supprime les zéros au début et les espaces en fin qui, autrement, auraient été ajoutés pour que la sortie du modèle soit de taille fixe.
to_timestamp et to_date passent les espaces blancs multiples de la chaîne en entrée si l'option FX n'est pas utilisée. FX doit être spécifié et être le 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'un seul espace.
Le texte ordinaire est autorisé dans les modèles to_char et sera remis en sortie de façon littérale. Vous pouvez placer une sous-chaîne entre des guillemets doubles pour forcer son interprétation en tant que texte littéral même s'il contient des mots clés de modèles. Par exemple, dans '"Hello Year "YYYY', les caractères YYYY seront remplacés par l'année mais le seul Y du mot Year ne le sera pas.
Si vous voulez avoir un guillemet double dans la sortie, vous devez le précéder d'un antislash, par exemple '\\"YYYY Month\\"' (deux antislashs sont nécessaire parce qu'un seul antislash a déjà une signification spéciale dans une chaîne).
La conversion YYYY d'une chaîne vers un champ de type timestamp ou date a une restriction dans le cas où vous utilisez une année avec plus de quatre chiffres. Vous devez utiliser des caractères non numériques ou un modèle après YYYY, sinon l'année sera toujours interprétée sur quatre chiffres. Par exemple, pour l'année 20000) : to_date('200001131', 'YYYYMMDD') sera interprété comme une année à quatre chiffres ; utilisez à la place 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 des chaînes de caractères vers 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 d'une chaîne vers un champ de type timestamp sont utilisées comme faisant partie de la fraction décimale des secondes. Par exemple, to_timestamp('12:3', 'SS:MS') n'est pas trois millisecondes mais 300 car la conversion le compte comme 12 + 0,3 secondes. Ceci signifie que le format SS:MS, les valeurs d'entrées 12:3, 12:30 et 12:300 spécifient le même nombre de millisecondes. Pour obtenir trois millisecondes, vous devez utiliser 12:003 car la conversion compte avec 12 + 0,003 = 12,003 secondes.
Voici un exemple encore 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, « 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 :
Un signe formaté en utilisant 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'implémentation Oracle n'autorise pas l'utilisation de MI devant 9, mais requiert plutôt que 9 précède MI.
9 résulté en une valeur avec le même nombre de chiffre. Si un chiffre n'est pas disponible, il est remplacé par un espace.
TH ne convertit pas les valeurs inférieures à zéro et ne convertit pas les nombres à fraction.
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 suivant 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' |