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.