Wyodrębnij datę (rrrr / mm / dd) ze znacznika czasu w PostgreSQL

250

Chcę wyodrębnić tylko część daty ze znacznika czasu w PostgreSQL.

Potrzebuję tego DATEtypu postgresql, aby móc wstawić go do innej tabeli, która oczekuje DATEwartości.

Na przykład, jeśli mam 2011/05/26 09:00:00, chcę2011/05/26

Próbowałem castować, ale dostaję tylko 2011:

timestamp:date
cast(timestamp as date)

Próbowałem to_char()z to_date():

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

Próbowałem uczynić to funkcją:

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

Jaki jest najlepszy sposób na wyodrębnienie daty (rrrr / mm / dd) ze znacznika czasu w PostgreSQL?

keren
źródło

Odpowiedzi:

432

Możesz przesłać swój znacznik czasu na datę, dodając do niego sufiks ::date. Tutaj, w psql, jest znacznik czasu:

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

Teraz rzucimy na randkę:

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

Z drugiej strony możesz użyć date_trunc funkcji. Różnica między nimi polega na tym, że ten drugi zwraca ten sam typ danych, co timestamptzutrzymanie nietkniętej strefy czasowej (jeśli jest to potrzebne).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
Wayne Conrad
źródło
3
nie działa, po prostu wypróbowałem „wybierz” 2010-01-01 12:00:00 :: timestamp :: date; ” . zwraca tylko rok 2011. Próbowałem już date (datownik) i (datownik) :: date, ale dostaję tylko część roku, a nie pełną datę, której potrzebuję.
keren
1
@kerenk, teraz to dziwne. Próbowałeś tego w psql?
Wayne Conrad
40
@keren, psql to narzędzie wiersza polecenia - nie używasz go (ale rozważ to). Podczas wykonywania zapytania w pgadmin3 spójrz na okienko danych wyjściowych. Możesz zmienić rozmiar kolumn; domyślny rozmiar kolumny jest zbyt krótki, aby pokazać całą datę i pokazuje tylko rok. Użyj myszy, aby rozwinąć tę kolumnę, a powinieneś zobaczyć całość.
Wayne Conrad
11
omg masz rację. czuję się tak głupi. dzięki za zwrócenie na to uwagi.
keren
Jeden przypadek, w którym natknąłem się na to, że to nie działa, dotyczy Wiewiórki. Dzięki tej składni Squirrel da ci pole do wprowadzania wartości parametrów dla parametru „: date”.
James Kingsbery
104

Użyj funkcji daty :

select date(timestamp_field) from table

Od reprezentacji pola znaków do daty, której możesz użyć:

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

Kod testowy:

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;

Wynik testu:

wynik pgAdmin

Wynik pgAdmin szeroki

James Allman
źródło
1
próbowałem tego, ale dostaję tylko 2011 w zamian zamiast pełnej daty, takiej jak 2011/05/26
keren
Zdałem sobie sprawę, że nie pracujesz z typem danych harmonogramu. Zmieniono, aby działał z ciągiem reprezentacji znacznika czasu w podanym formacie.
James Allman
Jak wykonujesz SQL? psql?
James Allman
Używam pgAdmin III PostgresSQL
Keren
11
Zauważyłem, kiedy przeprowadzam test w pgAdmin III, kolumna „data” jest wystarczająco szeroka, aby wyświetlić rok. Chwyć uchwyt kolumny i rozwiń kolumnę, aby zobaczyć pełną datę.
James Allman
10

Próbowałeś umówić się na randkę <mydatetime>::date?

leonbloy
źródło
1
To działa dobrze. Jak zauważono w komentarzach do odpowiedzi Wayne'a Conrada, Keren został wprowadzony w błąd przez zbyt wąską kolumnę w okienku wyjściowym pgAdmin.
KenB
9

Działa to dla mnie w Pythonie 2.7

 select some_date::DATE from some_table;
thedarkgriffen
źródło
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)

Kolejny zestaw testowy:

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

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Grzegorz Szpetkowski
źródło
Właśnie próbowałem twój w pgAdmin, ale d ma tylko 2011 nie pełną datę, której potrzebowałem! :(
keren
@keren: co z SELECT pg_catalog.date („2011/05/26 09:00:00”); ?
Grzegorz Szpetkowski
może ma to coś wspólnego z formatowaniem wartości wyjściowej. Myślę, że wartość zwrotna prawdopodobnie zawiera dzień i miesiąc, ale po prostu nie jest pokazywana na scree?
keren
wpisując styl SHOW; game me "ISO, DMY"
keren
4

Po prostu zrób, select date(timestamp_column)a dostaniesz jedyną część daty. Czasami robienie select timestamp_column::datemoże powrócić date 00:00:00tam, gdzie nie usuwa 00:00:00części. Ale widziałem, date(timestamp_column)że działa idealnie we wszystkich przypadkach. Mam nadzieję że to pomoże.

Koushik Das
źródło
3

W postgresie po prostu: TO_CHAR (kolumna_czasu, „DD / MM / RRRR”) jako data_desłania

Elmira Behzad
źródło