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


250

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

J'ai besoin que ce soit un DATEtype postgresql afin que je puisse l'insérer dans une autre table qui attend une DATEvaleur.

Par exemple, si je l'ai 2011/05/26 09:00:00, je veux2011/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

Quelle est la meilleure façon d'extraire la date (aaaa / mm / jj) d'un horodatage dans PostgreSQL?

Réponses:


432

Vous pouvez convertir votre horodatage en une date en la suffixant avec ::date. Voici, en 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'un autre côté, vous pouvez utiliser la date_truncfonction. La différence entre eux est que ces derniers renvoient le même type de données comme en timestamptzgardant 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)

3
ne fonctionne pas, essayez simplement "select '2010-01-01 12:00:00' :: timestamp :: date;" . il ne renvoie que l'année 2011. j'avais déjà essayé date (timestamp) et (timestamp) :: date mais je n'obtiens que la partie année en retour, pas la date complète dont j'ai besoin.
Keren

1
@kerenk, maintenant c'est étrange. L'avez-vous essayé en psql?
Wayne Conrad

40
@keren, psql est un utilitaire de ligne de commande - vous ne l'utilisez pas (mais pensez-y). Lorsque vous exécutez la requête dans pgadmin3, regardez le volet de sortie des données. Vous pouvez redimensionner les colonnes; la taille de colonne par défaut est trop courte pour afficher la date entière et n'affiche que l'année. Utilisez votre souris pour développer cette colonne et vous devriez voir le tout.
Wayne Conrad

11
omg tu as raison. je me sens tellement stupide. merci de l'avoir signalé.
keren

Un cas dans lequel j'ai rencontré un problème est celui de Squirrel. Avec cette syntaxe, Squirrel vous donnera une boîte de saisie pour entrer les valeurs des paramètres pour le paramètre ": date".
James Kingsbery

104

Utilisez la fonction date :

select date(timestamp_field) from table

D'une représentation de champ de caractères à 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:

Résultat pgAdmin

pgAdmin résultat large


1
j'ai essayé mais je n'ai que 2011 en retour au lieu de la date complète comme 2011/05/26
keren

J'ai réalisé que vous ne travaillez pas avec un type de données d'horodatage. Révisé pour fonctionner avec une représentation sous forme de chaîne d'un horodatage au format que vous avez fourni.
James Allman

Comment exécutez-vous le sql? psql?
James Allman

j'utilise pgAdmin III postgresSQL
keren

11
J'ai remarqué que lorsque j'effectue un test dans pgAdmin III, la colonne «date» n'est que suffisamment large pour afficher l'année. Saisissez la poignée de la colonne et développez la colonne pour voir la date complète.
James Allman

10

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


1
Cela fonctionne très bien. Comme indiqué dans les commentaires sur la réponse de Wayne Conrad, Keren a été induit en erreur par une colonne excessivement étroite dans le volet de sortie de pgAdmin.
KenB


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)

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)

j'ai juste essayé le vôtre dans pgAdmin mais d a seulement 2011 pas la date complète dont j'avais besoin! :(
keren

@keren: qu'en est-il de SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski

cela a peut-être quelque chose à voir avec le formatage de la valeur de sortie. Je pense que la valeur de retour contient probablement le jour et le mois, mais ce n'est tout simplement pas affiché sur les éboulis?
keren

en tapant SHOW datestyle; game me "ISO, DMY"
keren

4

Il suffit de faire select date(timestamp_column)et vous obtenez la seule la partie date. Parfois, cela select timestamp_column::datepeut revenir date 00:00:00là où il ne supprime pas la 00:00:00pièce. Mais j'ai vu date(timestamp_column)fonctionner parfaitement dans tous les cas. J'espère que cela t'aides.


3

En postgres, simplement: TO_CHAR (timestamp_column, 'DD / MM / YYYY') as submit_date

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.