รวมคอลัมน์ปี เดือน วัน ชั่วโมง นาที และวินาทีที่แยกจากกันเป็นคอลัมน์การประทับเวลาเดียว

ชุดข้อมูลของฉันประกอบด้วยคอลัมน์ปี เดือน วัน ชั่วโมง นาที และวินาทีแยกกันดังต่อไปนี้ โดยคั่นด้วยช่องว่าง:

+-------------------+
|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|
+-------------------+

ฉันต้องการรวมพวกมันเป็นคอลัมน์เดียวภายใต้ประเภทข้อมูลการประทับเวลา ฉันได้สร้างคอลัมน์ใหม่ในประเภทข้อมูลการประทับเวลาและอัปเดตคอลัมน์ด้วยรหัสต่อไปนี้:

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

แต่ฉันเผชิญกับข้อผิดพลาดดังต่อไปนี้:

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

ยิ่งไปกว่านั้น ฉันสามารถสร้างการรวมล่วงหน้าตามประเภทข้อมูล varchar ได้


person A.Amidi    schedule 18.11.2012    source แหล่งที่มา
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. ดูเหมือนจะเป็นคำแนะนำที่ดี คุณลองหรือยัง?   -  person Mat    schedule 18.11.2012
comment
@Mat ใช่ฉันได้ลองแล้วและกำหนดปี, เดือน, วันเป็นประเภทข้อมูลวันที่และชั่วโมงนาทีและวินาทีเป็นประเภทข้อมูลเวลา จากนั้นฉันก็ทำตามคำสั่ง แต่พบข้อผิดพลาดข้างต้น   -  person A.Amidi    schedule 18.11.2012


คำตอบ (3)


ผลลัพธ์ของการแสดงออก

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

ไม่ใช่การประทับเวลา แต่เป็นข้อความธรรมดา ข้อความแสดงข้อผิดพลาดเพียงบอกคุณว่าประเภท text ไม่เหมาะสมกับประเภทของคอลัมน์ dt

คุณต้องส่งนิพจน์ สมบูรณ์ ดังนี้:

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

คุณได้รับคำตอบที่อธิบายข้อผิดพลาด: คุณต้องแปลง text ถึง timestamp อย่างชัดเจน

อย่างไรก็ตาม วิธีแก้ไขที่เหมาะสมคือการใช้ to_timestamp()

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

เพราะเหตุใด
การส่งแบบธรรมดา 'text'::timestamp ขึ้นอยู่กับการตั้งค่าในเครื่องสำหรับรูปแบบวันที่ / เวลา และอาจใช้งานได้ในการติดตั้งครั้งเดียว แต่ล้มเหลว "กะทันหัน" ในการติดตั้ง PostgreSQL อื่น รับประกันว่าคำสั่งที่ระบุจะทำงานได้ โดยไม่ขึ้นกับ
datestyle การตั้งค่าและสถานที่

ถ้าให้พูดให้ชัดเจนคือ รูปแบบในตัวอย่าง ('YYYY-MM-DD hh24:mi:ss') ตรงกับ ISO 8601 (มาตรฐาน SQL) ซึ่งใช้ได้กับภาษาใดๆ

person Erwin Brandstetter    schedule 18.11.2012

คุณต้องส่งแบบธรรมดาตั้งแต่ text ถึง timestamp without time zone:

(expression)::timestamp without time zone

ตัวอย่างเช่น:

Update s2 set dt = (year || '-' || month  || '-' || day  || ' ' || hour  || ':' || min  || ':' || second)::timestamp without time zone
person mys    schedule 18.11.2012
comment
และ timestamp มีค่าเริ่มต้นเป็น timestamp without time zone - person Erwin Brandstetter; 18.11.2012