As funções de formatação do PostgreSQL disponibilizam um poderoso conjunto de ferramentas para converter diversos tipos de dado (date/time, integer, floating point, numeric) em cadeias de caracteres formatadas, e para converter cadeias de caracteres formatadas nos tipos de dado especificados. A Tabela 6-12 mostra estas funções, que seguem uma convenção de chamada comum: o primeiro argumento é o valor a ser formatado, e o segundo argumento é a máscara que define o formato da entrada ou da saída.
Tabela 6-12. Funções de formatação
Função | Retorna | Descrição | Exemplo |
---|---|---|---|
to_char (timestamp, text) | text | converte carimbo de tempo (time stamp) em cadeia de caracteres | to_char(timestamp 'now','HH12:MI:SS') |
to_char (interval, text) | text | converte intervalo em cadeia de caracteres | to_char(interval '15h 2m 12s','HH24:MI:SS') |
to_char (int, text) | text | converte inteiro em cadeia de caracteres | to_char(125, '999') |
to_char (double precision,
text) | text | converte real e precisão dupla em cadeia de caracteres | to_char(125.8, '999D9') |
to_char (numeric, text) | text | converte numérico em cadeia de caracteres | to_char(numeric '-125.8', '999D99S') |
to_date (text, text) | date | converte cadeia de caracteres em data | to_date('05 Dec 2000', 'DD Mon YYYY') |
to_timestamp (text, text) | timestamp | converte cadeia de caracteres em carimbo de tempo | to_timestamp('05 Dec 2000', 'DD Mon YYYY') |
to_number (text, text) | numeric | converte cadeia de caracteres em numérico | to_number('12,454.8-', '99G999D9S') |
Na cadeia de caracteres usada como máscara de saída, existem certos elementos que são reconhecidos e substituídos pelos dados devidamente formatados a partir do valor a ser formatado. Qualquer texto que não faça parte de um elemento da máscara é simplesmente copiado sem alteração. Da mesma forma, na cadeia de caracteres usada como máscara de entrada, os elementos da máscara identificam as partes procuradas na cadeia de caracteres da entrada, e os valores a ser encontrados nestas posições.
A Tabela 6-13 mostra os elementos que podem ser utilizados na máscara para formatar valores de data e de hora.
Tabela 6-13. Elementos para máscara de conversão de data e hora
Elemento | Descrição |
---|---|
HH | hora do dia (01-12) |
HH12 | hora do dia (01-12) |
HH24 | hora do dia (00-23) |
MI | minuto (00-59) |
SS | segundo (00-59) |
MS | milissegundo (000-999) |
US | microssegundo (000000-999999) |
SSSS | segundos após a meia-noite (0-86399) |
AM ou A.M. ou PM ou P.M. | indicador de meridiano (maiúsculas) |
am ou a.m. ou pm ou p.m. | indicador de meridiano (minúsculas) |
Y,YYY | ano (4 e mais dígitos) com vírgula |
YYYY | ano (4 e mais dígitos) |
YYY | últimos 3 dígitos do ano |
YY | últimos 2 dígitos do ano |
Y | último dígito do ano |
BC ou B.C. ou AD ou A.D. | indicador de era (maiúscula) |
bc ou b.c. ou ad ou a.d. | indicador de era (minúscula) |
MONTH | nome completo do mês em maiúsculas (9 caracteres completado com espaços) |
Month | nome completo do mês em maiúsculas e minúsculas (9 caracteres completado com espaços) |
month | nome completo do mês em minúsculas (9 caracteres completado com espaços) |
MON | nome abreviado do mês em maiúsculas (3 caracteres) |
Mon | nome abreviado do mês em maiúsculas e minúsculas (3 caracteres) |
mon | nome abreviado do mês em minúsculas (3 caracteres) |
MM | número do mês (01-12) |
DAY | nome completo do dia em maiúsculas (9 caracteres completado com espaços) |
Day | nome completo do dia em maiúsculas e minúsculas (9 caracteres completado com espaços) |
day | nome completo do dia em minúsculas (9 caracteres completado com espaços) |
DY | nome abreviado do dia em maiúsculas (3 caracteres) |
Dy | nome abreviado do dia em maiúsculas e minúsculas (3 caracteres) |
dy | nome abreviado do dia em minúsculas (3 caracteres) |
DDD | dia do ano (001-366) |
DD | dia do mês (01-31) |
D | dia da semana (1-7; SUN=1) |
W | semana do mês (1-5) onde a primeira semana começa no primeiro dia do mês |
WW | número da semana do ano (1-53) onde a primeira semana começa no primeiro dia do ano |
IW | número da semana do ano ISO (A primeira quinta-feira do novo ano está na semana 1) |
CC | século (2 dígitos) |
J | Dia Juliano (dias desde 1 de janeiro de 4712 AC) |
Q | trimestre |
RM | mês em algarismos romanos (I-XII; I=Janeiro) - maiúsculas |
rm | mês em algarismos romanos (I-XII; I=Janeiro) - minúsculas |
TZ | zona horária - maiúsculas |
tz | zona horária - minúsculas |
Certos modificadores podem ser aplicados a qualquer elemento da máscara para alterar seu comportamento. Por exemplo, "FMMonth" é o elemento "Month" com o prefixo "FM". A Tabela 6-14 mostra os modificadores de elemento para formatação de data e hora.
Tabela 6-14. Modificadores dos elementos das máscara de conversão de data e hora
Modificador | Descrição | Exemplo |
---|---|---|
prefixo FM | modo de preenchimento (suprime completar com brancos e zeros) | FMMonth |
sufixo TH | adicionar o sufixo de número ordinal em maiúsculas | DDTH |
sufixo th | adicionar o sufixo de número ordinal em minúsculas | DDth |
prefixo FX | opção global de formato fixo (veja nota de utilização) | FX Month DD Day |
sufixo SP | modo de falar (spell mode) (ainda não implementado) | DDSP |
Notas relativas à utilização da formatação de data e hora:
O FM suprime zeros à esquerda e espaços à direita, que de outra forma seriam adicionados para fazer o elemento da saída ter comprimento fixo.
As funções to_timestamp
e to_date
desprezam os múltiplos espaços em branco na cadeia de caracteres de entrada quando
a opção FX não é utilizada. O FX deve
ser especificado como o primeiro elemento da máscara; por exemplo
to_timestamp('2000 JUN','YYYY MON') está correto, mas
to_timestamp('2000 JUN','FXYYYY MON') retorna erro,
porque to_timestamp
espera um único espaço em branco.
Se for desejada a presença de uma contrabarra ("\") em uma constante cadeia de caracteres, devem ser escritas duas contrabarras ("\\"); por exemplo '\\HH\\MI\\SS'. Isto vale para qualquer constante cadeia de caracteres no PostgreSQL.
Texto comum é permitido nas máscaras da função to_char
,
sendo reproduzidos literalmente. Podem ser colocados caracteres entre aspas
para serem interpretados como texto literal,
mesmo contendo palavras chaves para elemento. Por exemplo, em
'"Hello Year "YYYY', o YYYY
é substituído pelo ano da data, porém o Y de
"Year" não é.
Se for desejada uma aspa na saída esta deve ser precedida por uma contrabarra. Por exemplo '\\"YYYY Month\\"'.
A conversão YYYY de cadeia de caracteres para timestamp ou para date tem restrições quando são utilizados mais de 4 dígitos para o ano. Deve ser utilizado algum caractere que não seja um dígito ou um outro elemento após YYYY, senão o ano será sempre interpretado como tendo 4 dígitos. Por exemplo, (com o ano 20000): to_date('200001131', 'YYYYMMDD') é interpretado como um ano de 4 dígitos; o melhor é utilizar um separador que não seja um dígito após o ano, como to_date('20000-1131', 'YYYY-MMDD') ou to_date('20000Nov31', 'YYYYMonDD').
Os valores de milissegundos MS e microssegundos US, na conversão de uma cadeia de caracteres para um carimbo de tempo (time stamp), são interpretados como a sendo parte dos segundos após o ponto decimal. Por exemplo to_timestamp('12:3', 'SS:MS') não são 3 milissegundos, mas 300, porque a conversão interpreta como sendo 12 + 0.3. Isto significa que, para o formato SS:MS, os valores de entrada 12:3, 12:30 e 12:300 especificam o mesmo número de milissegundos. Para especificar três milissegundos deve ser utilizado 12:003, que na conversão é interpretado como 12 + 0.003 = 12.003 segundos.
A seguir está mostrado um exemplo mais complexo: to_timestamp('15:12:02.020.001230','HH:MI:SS.MS.US') é interpretado como 15 horas, 12 minutos, 2 segundos + 20 milissegundos + 1230 microssegundos = 2.021230 segundos.
A Tabela 6-15 mostra os elementos usados nas máscaras disponíveis para formatar valores numéricos.
Tabela 6-15. Elementos para máscara de conversão numérica
Elemento | Descrição |
---|---|
9 | valor com o número especificado de dígitos |
0 | valor com zeros à esquerda |
. (ponto) | ponto decimal |
, (vírgula) | separador de grupo (milhares) |
PR | valor negativo entre chaves |
S | valor negativo com o sinal de menos (utiliza a localização) |
L | símbolo da moeda (utiliza a localização) |
D | ponto decimal (utiliza a localização) |
G | separador de grupo (utiliza a localização) |
MI | sinal de menos na posição especificada (se número < 0) |
PL | sinal de mais na posição especificada (se número > 0) |
SG | sinal de mais/menos na posição especificada |
RN | algarismos romanos (entrada entre 1 e 3999) |
TH ou th | converte em número ordinal |
V | desloca n dígitos (veja as notas) |
EEEE | notação científica (ainda não implementada) |
Notas relativas à utilização da formatação numérica:
O sinal formatado utilizando SG, PL ou MI não está ancorado no número; por exemplo, to_char(-12, 'S9999') produz ' -12', mas to_char(-12, 'MI9999') produz '- 12'. A implementação do Oracle não permite utilizar o MI antes do 9, requer que o 9 preceda o MI.
O 9 especifica um valor com o mesmo número de dígitos que o número de 9s. Se não houver um dígito disponível, é colocado um espaço.
O TH não converte valores menores que zero e não converte números decimais.
O PL, o SG e o TH são extensões do PostgreSQL.
O V efetivamente
multiplica os valores de entrada por
10^n, onde
n é o número de dígitos após o
V. A função
to_char
não aceita utilizar
V juntamente com o ponto decimal
(Por exemplo, 99.9V99 não é permitido).
A Tabela 6-16 mostra alguns
exemplos de utilização da função to_char
.
Tabela 6-16. Exemplos da função to_char
Entrada | Saída |
---|---|
to_char(now(),'Day, DD HH12:MI:SS') | 'Tuesday , 06 05:39:18' |
to_char(now(),'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,'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,'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' |