Ekstrak tanggal (yyyy / mm / dd) dari stempel waktu di PostgreSQL

250

Saya ingin mengekstrak hanya bagian tanggal dari timestamp di PostgreSQL.

Saya membutuhkannya menjadi DATEtipe postgresql sehingga saya bisa memasukkannya ke tabel lain yang mengharapkan suatu DATEnilai.

Misalnya, jika sudah 2011/05/26 09:00:00, saya mau2011/05/26

Saya mencoba casting, tetapi saya hanya mendapatkan 2011:

timestamp:date
cast(timestamp as date)

Saya mencoba to_char()dengan to_date():

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

Saya mencoba membuatnya berfungsi:

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

Apa cara terbaik untuk mengekstrak tanggal (yyyy / mm / dd) dari cap waktu di PostgreSQL?

keren
sumber

Jawaban:

432

Anda dapat memberikan stempel waktu ke tanggal dengan mencapkannya dengan ::date. Di sini, dalam psql, adalah cap waktu:

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

Sekarang kita akan memasukkannya ke tanggal:

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

Di sisi lain Anda dapat menggunakan date_truncfungsi. Perbedaan di antara mereka adalah bahwa yang terakhir mengembalikan tipe data yang sama seperti timestamptzmenjaga zona waktu Anda tetap utuh (jika Anda membutuhkannya).

=> select date_trunc('day', now());
       date_trunc
------------------------
 2015-12-15 00:00:00+02
(1 row)
Wayne Conrad
sumber
3
tidak berfungsi, coba saja "pilih '2010-01-01 12:00:00' :: timestamp :: date;" . kembali hanya tahun 2011. saya sudah mencoba tanggal (timestamp) dan (timestamp) :: date tetapi saya hanya mendapatkan bagian tahun sebagai imbalan bukan tanggal penuh yang saya butuhkan.
keren
1
@kerenk, Nah, itu aneh. Apakah Anda mencobanya dalam psql?
Wayne Conrad
40
@keren, psql adalah utilitas baris perintah - Anda tidak menggunakannya (tetapi pertimbangkanlah) Saat Anda menjalankan kueri di pgadmin3, lihat panel output data. Anda dapat mengubah ukuran kolom; ukuran kolom default terlalu pendek untuk menampilkan seluruh tanggal dan hanya menunjukkan tahun. Gunakan mouse Anda untuk memperluas kolom itu dan Anda akan melihat semuanya.
Wayne Conrad
11
omg kamu benar. aku merasa bodoh. terima kasih telah menunjukkannya.
keren
Satu kasus saya berlari ke tempat ini tidak berhasil adalah di Squirrel. Dengan sintaks ini, Squirrel akan memberi Anda kotak input untuk memasukkan nilai parameter untuk parameter ": date".
James Kingsbery
104

Gunakan fungsi tanggal :

select date(timestamp_field) from table

Dari representasi bidang karakter hingga tanggal, Anda dapat menggunakan:

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

Kode uji:

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;

Hasil tes:

hasil pgAdmin

pgAdmin hasilnya luas

James Allman
sumber
1
Saya sudah mencobanya tetapi saya hanya mendapatkan 2011 sebagai ganti dari tanggal lengkap seperti 2011/05/26
keren
Saya menyadari Anda tidak bekerja dengan tipe data timetamp. Direvisi untuk bekerja dengan representasi string cap waktu dalam format yang Anda berikan.
James Allman
Bagaimana Anda menjalankan sql? psql?
James Allman
Saya menggunakan pgAdmin III postgresSQL
keren
11
Saya perhatikan ketika saya melakukan tes di pgAdmin III kolom 'tanggal' hanya cukup lebar untuk menampilkan tahun. Raih pegangan kolom dan perluas kolom untuk melihat tanggal selengkapnya.
James Allman
10

Sudahkah Anda mencoba mengubahnya menjadi kencan <mydatetime>::date?

leonbloy
sumber
1
Ini berfungsi dengan baik. Seperti dicatat dalam komentar pada jawaban Wayne Conrad, keren disesatkan oleh kolom yang terlalu sempit di panel output pgAdmin.
KenB
9

Ini bekerja untuk saya di python 2.7

 select some_date::DATE from some_table;
thedarkgriffen
sumber
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)

Alat tes lain:

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

SHOW datestyle ;
 DateStyle 
-----------
 ISO, MDY
(1 row)
Grzegorz Szpetkowski
sumber
Saya baru saja mencoba Anda di pgAdmin tetapi d hanya memiliki 2011 tidak tanggal penuh yang saya butuhkan! :(
keren
@keren: bagaimana dengan SELECT pg_catalog.date ('2011/05/26 09:00:00'); ?
Grzegorz Szpetkowski
mungkin ada hubungannya dengan memformat nilai output. Saya berpikir bahwa nilai pengembalian mungkin ada hari dan bulan di sana, tetapi tidak ditampilkan di scree?
keren
mengetik SHOW datestyle; game me "ISO, DMY"
keren
4

Lakukan saja select date(timestamp_column)dan Anda akan mendapatkan satu-satunya bagian tanggal. Kadang-kadang melakukan select timestamp_column::datemungkin kembali di date 00:00:00tempat itu tidak menghapus 00:00:00bagian. Tetapi saya telah melihat date(timestamp_column)untuk bekerja dengan sempurna dalam semua kasus. Semoga ini membantu.

Koushik Das
sumber
3

Dalam postgres cukup: TO_CHAR (timestamp_column, 'DD / MM / YYYY') sebagai submission_date

Elmira Behzad
sumber