Páginas

quinta-feira, 26 de dezembro de 2013

[PostgreSQL] - Formatação de Data e Hora com as funções TO_CHAR e TO_DATE

Dados 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, 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.

Fonte:
http://postgresqlbr.blogspot.com.br/2013/06/formatacao-de-data-e-hora-com-as.html

7 comentários:

  1. Ola.

    eu tenho um banco no PostgreSQL o o nome da tabela clientes e a coluna chamada nasc.

    Gostaria de saber como faço para pegar por exemplo todos os registros com o mes 4. ja tentei de todas as formas e nao consigo.
    No SQL SERVER eu consegui assim :

    SELECT nasc FROM clientes WHERE month(nasc)= '12' ;


    porem no PostgreSQL ele não aceita esse comando, da o seguinte erro:


    ERRO: função month(character varying) não existe
    LINE 1: SELECT nasc FROM clientes WHERE MONTH(nasc)= '04'
    ^
    HINT: Nenhuma função corresponde com o nome e os tipos de argumentos informados.

    ResponderExcluir
  2. Bom dia Littiele,

    A consulta que está precisando você consegue resolver com está demonstrado no Post nesta seção:

    postgres=# SELECT TO_CHAR(current_date, 'DD') AS DIA, TO_CHAR(current_date, 'MM') AS MES, TO_CHAR(current_date, 'YYYY') AS ANO;

    SELECT nasc FROM clientes WHERE TO_CHAR(nasc , 'MM') = '04' ;

    Qualquer dúvida, favor comentar.

    Att,
    Emerson

    ResponderExcluir
  3. Bom dia Emerson,

    Desculpa a ignorância no postgresql nao manjo quase nada..rs


    Executei o comando:

    SELECT nasc FROM clientes WHERE TO_CHAR(nasc , 'MM') = '04' ;


    OBS: tentei trocar o

    deu o erro: eu tenho q executar os dois select ao mesmo tempo que você informou ou apenas o que eu disse acima ?


    ERRO: função to_char(character varying, unknown) não existe
    LINE 1: SELECT nasc FROM clientes WHERE TO_CHAR(nasc , 'MM') = '04' ...
    ^
    HINT: Nenhuma função corresponde com o nome e os tipos de argumentos informados. Você precisa adicionar conversões de tipo explícitas.
    ********** Error **********

    ResponderExcluir
  4. Littiele,

    Qual a versão do PostgreSQL que está utilizando?

    ResponderExcluir
  5. Littiele,

    Dá uma olhada na Documentação no link abaixo:
    http://www.postgresql.org/docs/9.3/static/functions-formatting.html

    A consulta que tinha te passado era para funcionar normalmente, verifica na documentação se tem algo que precisa fazer.

    Att,
    Emerson

    ResponderExcluir
  6. eu sei que se por exemplo eu fizer assim :

    select current_date, date_part('month',current_date);

    ele traz o resultado da data do mes atual

    date | date_part

    2015-12-17 | 12

    porem nao estou conseguindo fazer com que ele faça isso no banco ao invés de pegar a data atual

    select nasc from clientes, date_part('month',nasc)='04'

    ResponderExcluir