Integrasikan kolom tahun, bulan, hari, jam, menit, dan detik yang terpisah sebagai satu kolom stempel waktu

Kumpulan data saya berisi kolom tahun, bulan, hari, jam, menit, dan detik terpisah sebagai berikut yang dipisahkan oleh spasi:

+-------------------+
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
+-------------------+

Saya ingin mengintegrasikannya sebagai satu kolom di bawah tipe data stempel waktu. Saya telah membuat kolom baru dalam tipe data stempel waktu dan memperbarui kolom dengan kode berikut:

 Update s2
 set dt = year || '-' || month  || '-' || day
               || ' ' || hour  || ':' || min  || ':' || second 

Tapi saya menghadapi kesalahan berikut:

ERROR:  column "dt" is of type timestamp without time zone but expression is of type text
LINE 1:  Update temp set dt= year || '-' || month  || '-' || day  ||...
                             ^
HINT:  You will need to rewrite or cast the expression.

********** Error **********

ERROR: column "dt" is of type timestamp without time zone but expression is of type text
SQL state: 42804
Hint: You will need to rewrite or cast the expression.
Character: 22

Selain itu, saya dapat melakukan integrasi sebelumnya dengan tipe data varchar.


person A.Amidi    schedule 18.11.2012    source sumber
comment
column "dt" is of type timestamp without time zone but expression is of type text, You will need to rewrite or cast the expression. Sepertinya itu nasihat yang bagus. Apakah Anda mencobanya?   -  person Mat    schedule 18.11.2012
comment
@Mat, ya saya sudah mencobanya dan mendefinisikan tahun, bulan, hari sebagai tipe data tanggal dan jam, menit, dan detik sebagai tipe data waktu lalu saya melakukan perintah tetapi kesalahan yang disebutkan di atas terjadi.   -  person A.Amidi    schedule 18.11.2012


Jawaban (3)


Hasil dari ekspresi

year || '-' || month  || '-' || day || ' ' || hour  || ':' || min  || ':' || second 

bukan stempel waktu tetapi teks biasa. Pesan kesalahannya sekadar memberi tahu Anda, bahwa tipe text tidak sesuai dengan tipe kolom dt.

Anda harus memberikan ekspresi lengkap seperti ini:

(year || '-' || month  || '-' || day || ' ' || hour  || ':' || min  || ':' || second)::timestamp
person A.H.    schedule 18.11.2012

Anda mendapat jawaban yang menjelaskan kesalahan tersebut: Anda perlu mentransmisikan text ke timestamp secara eksplisit.

Namun, solusi yang tepat adalah dengan menggunakan to_timestamp()

UPDATE s2
SET dt = to_timestamp(year || '-' || month  || '-' || day || ' '
                           || hour  || ':' || min  || ':' || second
                     ,'YYYY-MM-DD hh24:mi:ss');

Mengapa?
Pemeran biasa 'text'::timestamp bergantung pada pengaturan lokal untuk format tanggal/waktu dan mungkin berfungsi dalam satu instalasi tetapi "tiba-tiba" gagal di instalasi PostgreSQL yang lain. Pernyataan yang diberikan dijamin berfungsi, terlepas dari
datestyle pengaturan dan lokal.

Tepatnya, pola dalam contoh ('YYYY-MM-DD hh24:mi:ss') cocok dengan ISO 8601 (standar SQL), yang valid untuk lokal apa saja.

person Erwin Brandstetter    schedule 18.11.2012

Anda memerlukan pemeran sederhana dari text hingga timestamp without time zone:

(expression)::timestamp without time zone

Misalnya:

Update s2 set dt = (year || '-' || month  || '-' || day  || ' ' || hour  || ':' || min  || ':' || second)::timestamp without time zone
person mys    schedule 18.11.2012
comment
Dan timestamp defaultnya adalah timestamp without time zone. - person Erwin Brandstetter; 18.11.2012