จะแทรกการประทับเวลาใน Oracle ได้อย่างไร


93

ฉันมี Oracle DB ที่มีtimestampฟิลด์อยู่ในนั้น รหัส SQL ที่ถูกต้องในการแทรกtimestampลงในฟิลด์นี้คืออะไร?


9
"ฉันไม่พบข้อมูลนี้ทุกที่" เอกสาร Oracle ครอบคลุมและออนไลน์ ค้นหาได้ที่นี่: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC

คำตอบ:


141
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

หากคุณต้องการให้แทรกการประทับเวลาปัจจุบัน:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);

1
ทำไมTO_DATEแทนที่จะเป็นTO_TIMESTAMP?
Dave Costa

ไม่สำคัญสำหรับINSERTคำสั่งธรรมดานี้ แต่โดยทั่วไปคุณไม่ต้องการใช้ตัวแปรการผูกเช่นนี้ การแปลงประเภทในคำสั่งแรกของคุณป้องกันไม่ให้มีการผูกข้อมูลที่ละเอียดอ่อนซึ่งจำกัดความสามารถของ Oracle ในการสร้างแผนงานที่ดี เครื่องมือเพิ่มประสิทธิภาพอาจทำงานได้ดีขึ้นหากคุณใช้values (:ts_val)แทนโดยสมมติว่า: ts_val จับคู่กับการประทับเวลาโดยตรง
Jon Heller

@JonHeller คุณสามารถแสดงตัวอย่างเฉพาะได้หรือไม่ว่าการใช้to_timestampจะทำให้แผนการดำเนินการที่ไม่ดีสำหรับคำสั่ง SQL ที่สามารถวางแผนได้อย่างไร ฉันสามารถแสดงตัวอย่างของวิธีการที่จะไม่ แต่สิ่งที่ฉันคิดว่าเราทุกคนต้องการหลีกเลี่ยงคือการบีบบังคับชนิดข้อมูลที่ไม่คาดคิดซึ่งขัดขวางการใช้การดำเนินการของแหล่งข้อมูลแถวที่คาดไว้ (เช่นค่าที่เหมาะสมที่สุด)
Jeff Holt

@ jeff6times7 ดูGist นี้สำหรับคำอธิบายว่าตัวแปรการผูกที่ไม่ได้แปลงกลับมีประสิทธิภาพดีกว่าตัวแปรการผูกที่แปลงอย่างไร ความแตกต่างอาจมีความสำคัญก็ต่อเมื่อข้อมูลมีการบิดเบือน ด้วยประเภทการผูกแบบเนทีฟ Oracle สามารถเข้าใจข้อมูลได้ดีขึ้นและทำการประมาณการได้ดีขึ้นตามค่าต่างๆ
Jon Heller

24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPและSYSTIMESTAMPเป็นคำสงวนของ Oracle สำหรับวัตถุประสงค์นี้ SYSDATEพวกเขาเป็นอนาล็อกของการประทับเวลา



9

ชนิดขึ้นอยู่กับว่าค่าที่คุณต้องการแทรกนั้นมาจากไหน หากคุณต้องการแทรกเวลาปัจจุบันคุณสามารถใช้CURRENT_TIMESTAMPดังที่แสดงในคำตอบอื่น ๆ (หรือSYSTIMESTAMP)

หากคุณมีเวลาเป็นสตริงและต้องการแปลงเป็นการประทับเวลาให้ใช้นิพจน์เช่น

to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')

องค์ประกอบรูปแบบเวลาคือฉันหวังว่าจะอธิบายได้เองยกเว้นว่าFF3หมายถึง 3 หลักของความเที่ยงวินาทีย่อย คุณสามารถไปได้สูงถึง 6 หลักของความแม่นยำ

หากคุณกำลังแทรกจากแอปพลิเคชันคำตอบที่ดีที่สุดอาจขึ้นอยู่กับวิธีการจัดเก็บค่าวันที่ / เวลาในภาษาของคุณ ตัวอย่างเช่นคุณสามารถแมปวัตถุ Java บางรายการกับTIMESTAMPคอลัมน์ได้โดยตรงแต่คุณต้องเข้าใจการJDBCแม็ปประเภท


4

ฉันชอบตัวอักษรประทับเวลา ANSI:

insert into the_table 
  (the_timestamp_column)
values 
  (timestamp '2017-10-12 21:22:23');

รายละเอียดเพิ่มเติมในคู่มือ: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062


Oracle 11. ฟิลด์ที่กำหนดเป็น TIMESTAMP (6) ไม่ใช่ NULL การใช้ timestamp '2019-05-16 10:05:51:19:277401'ฉันมีข้อผิดพลาดนี้: ORA-01882: ไม่พบเขตเวลา
Alex 75

1

การใส่วันที่ใน sql

insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');

หากสมมติว่าเราต้องการแทรกวันที่ของระบบ

insert
into tablename (timestamp_value)
values (sysdate);

0

ก่อนอื่นคุณต้องทำให้ฟิลด์เป็น Nullable หลังจากนั้นก็ง่ายมาก - แทนที่จะใส่ค่าให้ใส่รหัสCURRENT_TIMESTAMPนี้


0

สำหรับการอ้างอิงในอนาคตของฉันเอง:

ด้วย cx_Oracle ให้ใช้ cursor.setinputsize (... ):

mycursor = connection.cursor();

mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);

ไม่จำเป็นต้องมีการแปลงในฐานข้อมูล ดูเอกสาร Oracle


0

หนึ่งสามารถใช้

INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');

ด้วยวิธีนี้คุณจะไม่ต้องกังวลเกี่ยวกับสตริงรูปแบบวันที่เพียงแค่ใช้รูปแบบการประทับเวลาเริ่มต้น

ทำงานร่วมกับ Oracle 11 ไม่รู้ว่าจะทำกับ Oracle เวอร์ชันก่อนหน้าหรือไม่


-6
CREATE TABLE Table1 (
id int identity(1, 1) NOT NULL,
Somecolmn varchar (5),
LastChanged [timestamp] NOT NULL)

ใช้งานได้กับ mssql 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.