Extrair data (aaaa / mm / dd) de um registro de data e hora no PostgreSQL

250

Quero extrair apenas a parte da data de um carimbo de data e hora no PostgreSQL.

Eu preciso que seja do DATEtipo postgresql para que eu possa inseri-lo em outra tabela que espera um DATEvalor.

Por exemplo, se eu tiver 2011/05/26 09:00:00, eu quero2011/05/26

Tentei fazer o casting, mas só recebo 2011:

timestamp:date
cast(timestamp as date)

Eu tentei to_char()com to_date():

SELECT to_date(to_char(timestamp, 'YYYY/MM/DD'), 'YYYY/MM/DD') 
FROM val3 WHERE id=1;

Eu tentei fazer isso uma função:

CREATE OR REPLACE FUNCTION testing() RETURNS void AS '
DECLARE i_date DATE;
BEGIN
    SELECT to_date(to_char(val1, "YYYY/MM/DD"),"YYYY/MM/DD") 
      INTO i_date FROM exampTable WHERE id=1;
    INSERT INTO foo(testd) VALUES (i);
END

Qual é a melhor maneira de extrair data (aaaa / mm / dd) de um registro de data e hora no PostgreSQL?

Keren
fonte

Respostas:

432

Você pode converter seu carimbo de data / hora em uma data com o sufixo ::date. Aqui, no psql, está um carimbo de data / hora:

# select '2010-01-01 12:00:00'::timestamp;
      timestamp      
---------------------
 2010-01-01 12:00:00

Agora vamos convertê-lo para uma data:

wconrad=# select '2010-01-01 12:00:00'::timestamp::date;
    date    
------------
 2010-01-01

Por outro lado, você pode usar a date_truncfunção. A diferença entre eles é que o último retorna o mesmo tipo de dados, como timestamptzmanter o fuso horário intacto (se necessário).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
Wayne Conrad
fonte
3
não funciona, apenas tentei "select '2010-01-01 12:00:00' :: timestamp :: date;" . ele retorna apenas no ano de 2011. Eu já havia tentado date (timestamp) e (timestamp) :: date, mas só recebo a parte do ano em retorno, não a data completa que eu preciso.
keren
1
@kerenk, agora isso é estranho. Você tentou no psql?
Wayne Conrad
40
@keren, psql é um utilitário de linha de comando - você não o está usando (mas considere). Ao executar a consulta no pgadmin3, observe o painel de saída de dados. Você pode redimensionar as colunas; o tamanho da coluna padrão é muito curto para mostrar a data inteira e mostra apenas o ano. Use o mouse para expandir essa coluna e você verá a coisa toda.
Wayne Conrad
11
omg, você está certo. eu me sinto tão idiota. Obrigado por apontar isso.
keren
Um caso que encontrei onde isso não funciona é no Squirrel. Com esta sintaxe, o Squirrel fornecerá uma caixa de entrada para inserir valores de parâmetro para o parâmetro ": date".
22412 James Kingsbery
104

Use a função de data :

select date(timestamp_field) from table

De uma representação de campo de caractere a uma data, você pode usar:

select date(substring('2011/05/26 09:00:00' from 1 for 10));

Código do teste:

create table test_table (timestamp_field timestamp);
insert into test_table (timestamp_field) values(current_timestamp);
select timestamp_field, date(timestamp_field) from test_table;

Resultado do teste:

resultado pgAdmin

Amplo resultado pgAdmin

James Allman
fonte
1
Eu tentei isso, mas eu só recebem 2011 em retorno em vez da data completa como 2011/05/26
keren
Percebi que você não está trabalhando com um tipo de dados de cronograma. Revisado para funcionar com uma representação de seqüência de caracteres de um carimbo de data / hora no formato que você forneceu.
James Allman 26/05
Como você está executando o sql? psql?
James Allman
Estou usando o pgAdmin III postgresSQL
keren
11
Notei que quando realizo um teste no pgAdmin III, a coluna 'data' é ampla o suficiente para exibir o ano. Pegue a alça da coluna e expanda a coluna para ver a data completa.
James Allman
10

Você já tentou chegar a um encontro <mydatetime>::date?

leonbloy
fonte
1
Isso funciona muito bem. Como observado nos comentários sobre a resposta de Wayne Conrad, keren foi desviada por uma coluna excessivamente estreita no painel de saída do pgAdmin.
KenB
9

Isso funciona para mim no python 2.7

 select some_date::DATE from some_table;
thedarkgriffen
fonte
4
CREATE TABLE sometable (t TIMESTAMP, d DATE);
INSERT INTO sometable SELECT '2011/05/26 09:00:00';
UPDATE sometable SET d = t; -- OK
-- UPDATE sometable SET d = t::date; OK
-- UPDATE sometable SET d = CAST (t AS date); OK
-- UPDATE sometable SET d = date(t); OK
SELECT * FROM sometable ;
          t          |     d      
---------------------+------------
 2011-05-26 09:00:00 | 2011-05-26
(1 row)

Outro kit de teste:

SELECT pg_catalog.date(t) FROM sometable;
    date    
------------
 2011-05-26
(1 row)

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Grzegorz Szpetkowski
fonte
Eu apenas tentei o seu no pgAdmin, mas d só tem 2011 e não a data completa que eu precisava! :(
Keren
@keren: e SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski
talvez tenha algo a ver com a formatação do valor de saída. Eu estou pensando que o valor de retorno provavelmente tem dia e mês lá, mas isso simplesmente não é mostrado no scree?
keren
digitando SHOW datestyle; jogo me "ISO, DMY"
Keren
4

Basta fazer select date(timestamp_column)e você obteria apenas a parte da data. Às vezes, fazer select timestamp_column::datepode retornar date 00:00:00onde não remove a 00:00:00peça. Mas já vi date(timestamp_column)funcionar perfeitamente em todos os casos. Espero que isto ajude.

Koushik Das
fonte
3

No postgres, simplesmente: TO_CHAR (timestamp_column, 'DD / MM / YYYY') como data de envio

Elmira Behzad
fonte