Formata√ß√£o de Data e Hora com as fun√ß√Ķes TO_CHAR e TO_DATE no PostgreSQL

Fun√ß√Ķes TO_CHAR e TO_DATE no PostgreSQL

PostgreSQLDados do tipo data e hora apresentam muitas varia√ß√Ķes de formata√ß√£o. Para o usu√°rio as datas se apresentam como campos textuais, mas para o SGBD PostgreSQL, s√£o tipos de dados espec√≠ficos, com caracter√≠sticas pr√≥prias, representando valores temporais. Para trabalhar com valores deste tipo, os sistemas fazem frequentemente convers√Ķes entre esses dois tipos.

Este post apresenta o uso das fun√ß√Ķes TO_DATE e TO_CHAR para formatar e tratar datas e horas.

* TO_CHAR – Formatando campos do tipo data para texto.

РExemplo 1: Formatação padrão

postgres=# SELECT TO_CHAR(current_date, ‘DD-MM-YYYY’);
to_char
————
17-06-2013
(1 registro)

– Exemplo 2: Formata√ß√£o padr√£o utilizando o separador “/”

postgres=# SELECT TO_CHAR(current_date, ‘DD/MM/YYYY’);
to_char
————
17/06/2013
(1 registro)

РExemplo 3: Alterando a ordem de visualização do mês, dia e ano apresentados.

postgres=# SELECT TO_CHAR(current_date, ‘DD-MM-YYYY’), TO_CHAR(current_date, ‘MM-DD-YYYY’), TO_CHAR(current_date, ‘YYYY-MM-YY’);
to_char   |  to_char   |  to_char
————+————+————
17-06-2013 | 06-17-2013 | 2013-06-13
(1 registro)

РExemplo 4: Separando mês, dia e ano em campos distintos.

postgres=# SELECT TO_CHAR(current_date, ‘DD’) AS DIA, TO_CHAR(current_date, ‘MM’) AS MES, TO_CHAR(current_date, ‘YYYY’) AS ANO;
dia | mes | ano
—–+—–+——
17  | 06  | 2013
(1 registro)

РExemplo 5: Apresentando o mês e o dia por extenso.

postgres=# SELECT TO_CHAR(current_date, ‘DAY’) AS DIA, TO_CHAR(current_date, ‘MON’) AS MES;
dia    | mes
———–+—–
MONDAY    | JUN
(1 registro)

– Exemplo 6: Apresentando a hora do sistema formatada.

postgres=# SELECT TO_CHAR(current_timestamp, ‘HH24:MI:SS’);
to_char
———-
07:29:13
(1 registro)
– Exemplo 7: Separando hora, minuto e segundos em camops distintos.

postgres=# SELECT TO_CHAR(current_timestamp, ‘HH24’), TO_CHAR(current_timestamp, ‘MI’), TO_CHAR(current_timestamp, ‘SS’);
to_char | to_char | to_char
———+———+———
07      | 29      | 13
(1 registro)

РExemplo 8: Usando TO_CHAR para inserção e atualização de dados.

postgres=#
postgres=# CREATE TABLE char_date_tst (momento varchar(10));
CREATE TABLE
postgres=# INSERT INTO char_date_tst (momento) VALUES (TO_CHAR(current_date, ‘MM-DD-YYYY’));
INSERT 0 1
postgres=# UPDATE char_date_tst SET momento = ’01-05-2010′ WHERE momento = TO_CHAR(current_date, ‘MM-DD-YYYY’);
UPDATE 1
postgres=# SELECT * FROM char_date_tst;
momento
————
01-05-2010
(1 registro)
* TO_DATE – Formatando campos do tipo texto para data.

– Exemplo 1: Usando TO_DATE para data em formato DD-MM-YYYY.

postgres=# SELECT TO_DATE(’30-04-2010′, ‘DD-MM-YYYY’);
to_date
————
2010-04-30
(1 registro)

– Exemplo 2: Usando TO_DATE para data em formato MM-DD-YYYY.

postgres=# SELECT TO_DATE(’04-30-2010′, ‘MM-DD-YYYY’);
to_date
————
2010-04-30
(1 registro)

– Exemplo 3: Usando TO_DATE para data com separador “/”

postgres=# SELECT TO_DATE(’04/30/2010′, ‘MM/DD/YYYY’);
to_date
————
2010-04-30
(1 registro)

– Exemplo 4: Teste de igualdade entre datas de formatos distintos usando TO_DATE.

postgres=# SELECT TO_DATE(’04-30-2010′, ‘MM-DD-YYYY’) = TO_DATE(’30-04-2010′, ‘DD-MM-YYYY’) AS IGUALDADE;
igualdade
———–
t
(1 registro)

РExemplo 5: Usando TO_DATE para inserção e atualização de dados.

postgres=# CREATE TABLE date_tst (momento date);
CREATE TABLE
postgres=# INSERT INTO date_tst VALUES (TO_DATE(’04-30-2010′, ‘MM-DD-YYYY’));
INSERT 0 1
postgres=# UPDATE date_tst SET momento = momento + 1 WHERE momento = TO_DATE(’04-30-2010′, ‘MM-DD-YYYY’);
UPDATE 1
postgres=# SELECT * FROM date_tst;
momento
————
2010-05-01
(1 registro)

 

* Considera√ß√Ķes Finais

Os exemplos acima n√£o cobrem todas as possibilidades, mas podem ajudar nas principais opera√ß√Ķes que lidem com a formata√ß√£o de datas e horas no postgresql. A cl√°usula CAST √© uma alternativa para convers√£o entre estes tipos de dados, mas n√£o realiza formata√ß√Ķes sobre os mesmos.

Para a tratar a formata√ß√£o de¬† timestamps e n√ļmeros, podem ser utilizadas as fun√ß√Ķes TO_TIMESTAMP e TO_NUMBER, que est√£o fora do escopo deste post.