As funções de formatação do PostgreSQL fornecem um poderoso conjunto de ferramentas para converter vários tipos de dado (date/time, integer, floating point, numeric) em cadeias de caracteres formatadas, e para converter cadeias de caracteres formatadas em tipos de dado específicos. A Tabela 9-22 mostra estas funções, que seguem uma convenção de chamada comum: o primeiro argumento é o valor a ser formatado, e o segundo argumento é o modelo que define o formato da entrada ou da saída.
Tabela 9-22. Funções de formatação
Função | Tipo retornado | Descrição | Exemplo |
---|---|---|---|
to_char(timestamp, text) | text | converte carimbo do tempo (time stamp) em cadeia de caracteres | to_char(current_timestamp, '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::real, '999D9') |
to_char(numeric, text) | text | converte numérico em cadeia de caracteres | to_char(-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 with time zone | converte cadeia de caracteres em carimbo do 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') |
Advertência: to_char(interval, text) está obsoleta, não devendo ser utilizada nos novos aplicativos. Será removida na próxima versão.
Em uma cadeia de caracteres modelo de saída (para to_char), existem certos padrões que são reconhecidos e substituídos pelos dados devidamente formatados a partir do valor a ser formatado. Qualquer texto que não seja um modelo padrão é simplesmente copiado sem alteração. Da mesma forma, em uma cadeia de caracteres modelo de entrada (para qualquer coisa menos to_char), os modelos padrão identificam as partes da cadeia de caracteres da entrada de dados a serem procuradas, e os valores a serem encontrados nestas partes.
A Tabela 9-23 mostra os modelos padrão disponíveis para formatar valores de data e de hora.
Tabela 9-23. Modelos padrão para formatação de data e hora
Modelo | 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 |
IYYY | ano ISO (4 ou mais dígitos) |
IYY | últimos 3 dígitos do ano ISO |
IY | últimos 2 dígitos do ano ISO |
I | último dígito do ano ISO |
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; Domingo é 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 | nome da zona horária - maiúsculas |
tz | nome da zona horária - minúsculas |
Certos modificadores podem ser aplicados aos modelos padrão para alterar seu comportamento. Por exemplo, FMMonth é o modelo "Month" com o modificador "FM". A Tabela 9-24 mostra os modificadores de modelo para formatação de data e hora.
Tabela 9-24. Modificadores de modelo padrão para formatação de data e hora
Modificador | Descrição | Exemplo |
---|---|---|
prefixo FM | modo de preenchimento (suprime completar com brancos e zeros) | FMMonth |
sufixo TH | sufixo de número ordinal maiúsculo | DDTH |
sufixo th | sufixo de número ordinal minúsculo | 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 sobre a 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 a saída do modelo ter comprimento fixo.
As funções to_timestamp e to_date saltam espaços em branco múltiplos na cadeia de caracteres de entrada quando a opção FX não é utilizada. O FX deve ser especificado como o primeiro item do modelo; 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 apenas.
É permitida a presença de texto comum nos modelos para to_char, sendo mostrados literalmente na saída. Uma parte da cadeia de caracteres pode ser colocada entre aspas, para obrigar sua interpretação como um texto literal mesmo contendo palavras chave do modelo. Por exemplo, em '"Hello Year "YYYY', o YYYY será substituído pelo ano do fornecido, mas o único Y em Year não será substituído.
Se for desejada a presença de aspas na saída, as mesmas devem ser precedidas por contrabarra. Por exemplo '\\"YYYY Month\\"'. (Duas contrabarras são necessárias, porque a contrabarra possui significado especial em uma constante cadeia de caracteres).
A conversão YYYY de cadeia de caracteres para timestamp ou para date tem restrição quando são utilizados anos com mais de 4 dígitos. Deve ser utilizado um modelo, ou algum caractere que não seja um dígito, após YYYY, senão o ano será sempre interpretado como tendo 4 dígitos. Por exemplo, (com o ano 20000): to_date('200001121', 'YYYYMMDD') é interpretado como um ano de 4 dígitos; em vez disso, deve ser utilizado um separador que não seja um dígito após o ano, como to_date('20000-1121', 'YYYY-MMDD') ou to_date('20000Nov21', 'YYYYMonDD').
Os valores de milissegundos MS e microssegundos US na conversão de uma cadeia de caracteres para um carimbo do tempo (timestamp), 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 segundos. 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 e 2 segundos + 20 milissegundos + 1230 microssegundos = 2.021230 segundos.
A numeração do dia da semana de to_char (veja o modelo padrão de formatação 'D') é diferente do dia da semana da função extract.
A Tabela 9-25 mostra os modelos padrão disponíveis para formatar valores numéricos.
Tabela 9-25. Modelos padrão para formatação de números
Modelo | 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 < e > |
S | sinal preso ao número (utiliza o idioma) |
L | símbolo da moeda (utiliza o idioma) |
D | ponto decimal (utiliza o idioma) |
G | separador de grupo (utiliza o idioma) |
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 [a] | algarismos romanos (entrada entre 1 e 3999) |
TH ou th | sufixo de número ordinal |
V | desloca o número especificado de dígitos (veja as notas sobre utilização) |
EEEE | notação científica (ainda não implementada) |
Notas: a. RN — roman numerals. |
Notas sobre a utilização da formatação numérica:
O sinal formatado utilizando SG, PL ou MI não está ancorado ao 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, requerendo que o 9 preceda o MI.
O 9 resulta em um valor com o mesmo número de dígitos que o número de 9s. Se não houver um dígito para colocar, é colocado espaço.
O TH não converte valores menores que zero e não converte números fracionários.
O PL, o SG e o TH são extensões do PostgreSQL.
O V multiplica efetivamente os valores da entrada por 10^n, onde n é o número de dígitos após o V. A função to_char não permite o uso de V junto com o ponto decimal (Por exemplo, 99.9V99 não é permitido).
A Tabela 9-26 mostra alguns exemplos de uso da função to_char.
Tabela 9-26. Exemplos de utilização da função to_char
Expressão | PostgreSQL 8.0.0 [a] | Oracle 10g (N. do T.) [b] |
---|---|---|
to_char(current_timestamp, 'Day, DD HH12:MI:SS') | 'Friday , 04 02:22:24' | 'Friday , 04 02:22:24' |
to_char(current_timestamp, 'FMDay, FMDD HH12:MI:SS') | 'Friday, 4 02:22:24' | 'Friday, 04 02:22:24' |
to_char(-0.1, '99.99') | ' -.10' | ' -.10' |
to_char(-0.1, 'FM9.99') | '-.1' | '-.1' |
to_char(0.1, '0.9') | ' 0.1' | ' 0.1' |
to_char(12, '9990999.9') | ' 0012.0' | ' 0012.0' |
to_char(12, 'FM9990999.9') | '0012.' | '0012.' |
to_char(485, '999') | ' 485' | ' 485' |
to_char(-485, '999') | '-485' | '-485' |
to_char(485, '9 9 9') | ' 4 8 5' | formato inválido |
to_char(1485, '9,999') | ' 1,485' | ' 1,485' |
to_char(1485, '9G999') | ' 1,485' | ' 1,485' |
to_char(148.5, '999.999') | ' 148.500' | ' 148.500' |
to_char(148.5, 'FM999.999') | '148.5' | '148.5' |
to_char(148.5, 'FM999.990') | '148.500' | '148.500' |
to_char(148.5, '999D999') -- com idioma | ' 148,500' | ' 148,500' |
to_char(3148.5, '9G999D999') | ' 3,148.500' | ' 3,148.500' |
to_char(-485, '999S') | '485-' | '485-' |
to_char(-485, '999MI') | '485-' | '485-' |
to_char(485, '999MI') | '485 ' | '485 ' |
to_char(485, 'FM999MI') | '485' | '485' |
to_char(485, 'PL999') | '+485' | formato inválido |
to_char(485, 'SG999') | '+485' | formato inválido |
to_char(-485, 'SG999') | '-485' | formato inválido |
to_char(-485, '9SG99') | '4-85' | formato inválido |
to_char(-485, '999PR') | '<485>' | '<485>' |
to_char(485, 'L999') -- com idioma | 'R$ 485' | ' R$485' |
to_char(485, 'RN') | ' CDLXXXV' | ' CDLXXXV' |
to_char(485, 'FMRN') | 'CDLXXXV' | 'CDLXXXV' |
to_char(5.2, 'FMRN') | 'V' | 'V' |
to_char(482, '999th') | ' 482nd' | formato inválido |
to_char(485, '"Good number:"999') | 'Good number: 485' | formato inválido |
to_char(485.8, '"Pre:"999" Post:" .999') | 'Pre: 485 Post: .800' | formato inválido |
to_char(12, '99V999') | ' 12000' | ' 12000' |
to_char(12.4, '99V999') | ' 12400' | ' 12400' |
to_char(12.45, '99V9') | ' 125' | ' 125' |
Notas: a. idioma — set lc_numeric to 'pt_BR'; set lc_monetary to 'pt_BR'; (N. do T.) b. idioma — ALTER SESSION SET NLS_TERRITORY="BRAZIL"; (N. do T.) |