PostgreSQL'de zaman damgasından tarihi (yyyy / aa / gg) ayıkla


250

PostgreSQL'de bir zaman damgasından sadece tarih kısmını ayıklamak istiyorum.

Ben DATEbir DATEdeğer bekliyor başka bir tabloya ekleyebilirsiniz böylece bir postgresql türü olması gerekiyor .

Mesela eğer varsa 2011/05/26 09:00:00, istiyorum2011/05/26

Dökümü denedim, ancak sadece 2011'i alıyorum:

timestamp:date
cast(timestamp as date)

Denedim to_char()ile to_date():

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

Bir işlev yapmaya çalıştım:

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

PostgreSQL'de zaman damgasından tarihi (yyyy / aa / gg) ayıklamanın en iyi yolu nedir?

Yanıtlar:


432

Zaman damganızı son ekleyerek bir tarihe atabilirsiniz ::date. Burada, psql'de, bir zaman damgasıdır:

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

Şimdi bir tarihe yayınlayacağız:

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

Öte yandan date_truncişlevi kullanabilirsiniz . Aralarındaki fark, ikincisinin timestamptzsaat diliminizi sağlam tutmak gibi aynı veri türünü döndürmesidir (gerekirse).

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

3
çalışmıyor, sadece "select '2010-01-01 12:00:00' :: timestamp :: date;" . Ben sadece yıl 2011 döndürür. ben zaten tarihi (timestamp) ve (timestamp) :: tarih denemişti ama ben sadece yıl kısmı karşılığında tam olarak ihtiyacım olan tarih olsun.
keren

1
@kerenk, Şimdi bu çok garip. Psql denediniz mi?
Wayne Conrad

40
@keren, psql bir komut satırı yardımcı programıdır - onu kullanmıyorsunuz (ancak bunu dikkate almalısınız). Sorguyu pgadmin3 içinde yürüttüğünüzde, veri çıkış bölmesine bakın. Sütunları yeniden boyutlandırabilirsiniz; varsayılan sütun boyutu tüm tarihi gösteremeyecek kadar kısadır ve yalnızca yılı gösterir. Bu sütunu genişletmek için farenizi kullanın ve her şeyi görmelisiniz.
Wayne Conrad

11
Aman tanrım haklısın. Kendimi aptal gibi hissediyorum. işaret ettiğiniz için teşekkürler.
keren

Bunun işe yaramadığı yerde karşılaştığım bir örnek Sincap'ta. Bu sözdizimiyle Sincap size ": date" parametresi için parametre değerleri girmeniz için bir giriş kutusu verecektir.
James Kingsbery

104

Tarih fonksiyonunu kullanın :

select date(timestamp_field) from table

Karakter alanı sunumundan şu tarihe kadar şunları kullanabilirsiniz:

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

Test kodu:

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;

Test sonucu:

pgAdmin sonucu

pgAdmin sonucu geniş


1
Ben denedim ama 2011
2011/05

Bir zaman damgası veri türüyle çalışmadığınızı fark ettim. Sağladığınız biçimde bir zaman damgasının dize ile temsil edilmesi için revize edildi.
James Allman

SQL'i nasıl yürütüyorsunuz? psql'in?
James Allman

pgAdmin III postgres kullanıyorumSQL
keren

11
PgAdmin III'te bir test yaptığımda 'tarih' sütununun yılı görüntülemek için yeterince geniş olduğunu fark ettim. Sütun tutamacını alın ve tam tarihi görmek için sütunu genişletin.
James Allman

10

İle bir tarihe yayınlamaya çalıştınız mı <mydatetime>::date?


1
Bu gayet iyi çalışıyor. Wayne Conrad'ın cevabındaki yorumlarda belirtildiği gibi, keren, pgAdmin'in çıktı bölmesindeki aşırı dar bir sütun tarafından saptırıldı.
KenB

9

Bu benim için python 2.7'de çalışıyor

 select some_date::DATE from some_table;

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)

Başka bir test kiti:

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

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

i sadece sizin adınızı pgAdmin çalıştı ama d sadece 2011 tam tarih gerekli değil! :(
keren

@keren: SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski

belki de çıktı değerini biçimlendirmeyle ilgisi vardır. Ben dönüş değeri muhtemelen orada gün ve ay olduğunu düşünüyorum, ama sadece dağ eteğindeki taş yığını üzerinde gösterilmiyor?
keren

SHOW datestyle yazarak; bana oyun "ISO, DMY"
keren

4

Sadece yap select date(timestamp_column)ve sen sadece tarih bölümünü alırsın. Bazen , parça kaldırılmadığı zaman select timestamp_column::dategeri dönebilir . Ama her durumda mükemmel çalıştığını gördüm . Bu yardımcı olur umarım.date 00:00:0000:00:00date(timestamp_column)


3

Postgres basitçe: gönderim_tarihi olarak TO_CHAR (timestamp_column, 'GG / AA / YYYY')

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.