web-dev-qa-db-fra.com

Extraire la date (aaaa / mm / jj) d'un horodatage dans PostgreSQL

Je veux extraire uniquement la partie date d'un horodatage dans PostgreSQL.

J'ai besoin que ce soit un type postgresql DATE pour pouvoir l'insérer dans une autre table qui attend une valeur DATE.

Par exemple, si j'ai 2011/05/26 09:00:00, je veux 2011/05/26

J'ai essayé le casting, mais je n'ai que 2011:

timestamp:date
cast(timestamp as date)

J'ai essayé to_char() avec to_date():

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

J'ai essayé d'en faire une fonction:

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

Quel est le meilleur moyen d'extraire une date (aaaa/mm/jj) d'un horodatage dans PostgreSQL?

210
keren

Vous pouvez convertir votre horodatage en une date en y ajoutant le suffixe ::date. Voici, dans psql, un horodatage:

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

Maintenant, nous allons le lancer à une date:

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

D'autre part, vous pouvez utiliser la fonction date_trunc. La différence entre eux est que ce dernier retourne le même type de données, comme timestamptz, tout en gardant votre fuseau horaire intact (si vous en avez besoin).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
379
Wayne Conrad

Utilisez la fonction date :

select date(timestamp_field) from table

D'une représentation de champ de caractère à une date, vous pouvez utiliser:

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

Code de test:

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;

Résultat du test:

pgAdmin result

pgAdmin result wide

90
jamesallman

Avez-vous essayé de le fixer à une date avec <mydatetime>::date?

9
leonbloy

Cela fonctionne pour moi dans python 2.7

 select some_date::DATE from some_table;
8
thedarkgriffen
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)

Un autre kit de test:

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

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
3

Il suffit de faire select date(timestamp_column) et vous obtiendrez la seule partie de la date. Parfois, faire select timestamp_column::date peut renvoyer date 00:00:00 sans supprimer la partie 00:00:00. Mais j'ai vu que date(timestamp_column) fonctionnait parfaitement dans tous les cas. J'espère que cela t'aides.

2
Koushik Das