Bagaimana cara memasukkan cap waktu di Oracle?

93

Saya memiliki Oracle DB dengan timestampbidang di dalamnya. Apa kode SQL yang benar untuk disisipkan timestampke bidang ini?

Mike Rifgin
sumber
9
"Saya tidak dapat menemukan info ini di mana pun." Dokumen Oracle bersifat komprehensif dan online. Temukan di sini: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC

Jawaban:

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

jika Anda ingin stempel waktu saat ini dimasukkan maka:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
reggie
sumber
1
Mengapa, TO_DATEbukan TO_TIMESTAMP?
Dave Costa
Tidak masalah untuk INSERTpernyataan sederhana ini , tetapi secara umum Anda tidak ingin menggunakan variabel bind seperti ini. Jenis konversi dalam pernyataan pertama Anda mencegahnya menjadi sensitif terhadap ikatan, yang membatasi kemampuan Oracle untuk membuat rencana yang baik. Pengoptimal dapat bekerja lebih baik jika Anda menggunakan values (:ts_val), dengan asumsi: ts_val memetakan langsung ke stempel waktu.
Jon Heller
@ JonHeller Dapatkah Anda menunjukkan contoh spesifik tentang bagaimana penggunaan to_timestampakan menyebabkan rencana eksekusi yang buruk untuk pernyataan SQL yang dapat direncanakan? Saya dapat menunjukkan contoh bagaimana tidak. Sebaliknya, apa yang saya pikir kita semua ingin hindari adalah pemaksaan tipe data yang tidak terduga yang menghalangi penggunaan operasi sumber baris yang diharapkan (yaitu, yang optimal).
Jeff Holt
@ jeff6times7 Lihat Inti ini untuk penjelasan tentang bagaimana variabel bind yang tidak dikonversi dapat mengungguli variabel bind yang dikonversi. Perbedaannya mungkin hanya penting jika datanya miring. Dengan jenis ikatan asli, Oracle dapat memahami data dengan lebih baik dan membuat perkiraan yang lebih baik berdasarkan nilai.
Jon Heller
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPdan SYSTIMESTAMPmerupakan kata-kata Oracle untuk tujuan ini. Mereka adalah analog cap waktu SYSDATE.

Quassnoi
sumber
20
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
Kash
sumber
9

Jenisnya tergantung dari mana nilai yang ingin Anda masukkan berasal. Jika Anda ingin memasukkan waktu saat ini Anda dapat menggunakan CURRENT_TIMESTAMPseperti yang ditunjukkan pada jawaban lain (atau SYSTIMESTAMP).

Jika Anda memiliki waktu sebagai string dan ingin mengubahnya menjadi stempel waktu, gunakan ekspresi seperti

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

Komponen format waktu, saya harap, cukup jelas, kecuali itu FF3berarti presisi sub-detik 3 digit. Anda dapat mencapai presisi setinggi 6 digit.

Jika Anda memasukkan dari aplikasi, jawaban terbaik mungkin bergantung pada bagaimana nilai tanggal / waktu disimpan dalam bahasa Anda. Misalnya Anda bisa memetakan objek Java tertentu secara langsung ke TIMESTAMPkolom, tetapi Anda perlu memahami JDBCpemetaan tipe.

Dave Costa
sumber
4

Saya lebih suka literal cap waktu ANSI:

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

Detail lebih lanjut di manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

seekor kuda tanpa nama
sumber
Oracle 11. Field didefinisikan sebagai TIMESTAMP (6) bukan NULL. Menggunakan timestamp '2019-05-16 10:05:51:19:277401'Saya memiliki kesalahan ini: ORA-01882: wilayah zona waktu tidak ditemukan
Alex 75
1

Memasukkan tanggal dalam sql

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

Jika misalkan kita ingin memasukkan tanggal sistem

insert
into tablename (timestamp_value)
values (sysdate);
Sai Krishna
sumber
0

Pertama-tama Anda perlu membuat field Nullable, lalu setelah itu sangat sederhana - alih-alih memberi nilai, masukkan kode ini CURRENT_TIMESTAMP.

Ahuramazda
sumber
0

Untuk referensi saya di masa mendatang:

Dengan cx_Oracle gunakan cursor.setinputsize (...):

mycursor = connection.cursor();

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

Tidak perlu mengubah db. Lihat Dokumentasi Oracle

Mario The Spoon
sumber
0

Seseorang dapat dengan mudah menggunakan

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

Dengan cara ini Anda tidak perlu khawatir tentang string format tanggal, cukup gunakan format stempel waktu default.

Bekerja dengan Oracle 11, tidak tahu apakah itu berfungsi untuk versi Oracle sebelumnya.

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

ini berfungsi untuk mssql 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
VGuest
sumber