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' |