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?

Keren
la source

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)
Wayne Conrad
la source
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

James Allman
la source
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?

leonbloy
la source
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
9

Cela fonctionne pour moi en python 2.7

 select some_date::DATE from some_table;
thedarkgriffen
la source
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)
Grzegorz Szpetkowski
la source
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.

Koushik Das
la source
3

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

Elmira Behzad
la source