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
Ola.
ResponderExcluireu 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.
Bom dia Littiele,
ResponderExcluirA 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
Bom dia Emerson,
ResponderExcluirDesculpa 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 **********
Littiele,
ResponderExcluirQual a versão do PostgreSQL que está utilizando?
9.3
ResponderExcluirLittiele,
ResponderExcluirDá 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
eu sei que se por exemplo eu fizer assim :
ResponderExcluirselect 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'