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.
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
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.
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
Jawaban:
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);
sumber
TO_DATE
bukanTO_TIMESTAMP
?INSERT
pernyataan 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 menggunakanvalues (:ts_val)
, dengan asumsi: ts_val memetakan langsung ke stempel waktu.to_timestamp
akan 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).INSERT INTO mytable (timestamp_field) VALUES (CURRENT_TIMESTAMP)
CURRENT_TIMESTAMP
danSYSTIMESTAMP
merupakan kata-kata Oracle untuk tujuan ini. Mereka adalah analog cap waktuSYSDATE
.sumber
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
sumber
Jenisnya tergantung dari mana nilai yang ingin Anda masukkan berasal. Jika Anda ingin memasukkan waktu saat ini Anda dapat menggunakan
CURRENT_TIMESTAMP
seperti yang ditunjukkan pada jawaban lain (atauSYSTIMESTAMP
).Jika Anda memiliki waktu sebagai string dan ingin mengubahnya menjadi stempel waktu, gunakan ekspresi seperti
Komponen format waktu, saya harap, cukup jelas, kecuali itu
FF3
berarti 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
TIMESTAMP
kolom, tetapi Anda perlu memahamiJDBC
pemetaan tipe.sumber
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
sumber
timestamp '2019-05-16 10:05:51:19:277401'
Saya memiliki kesalahan ini: ORA-01882: wilayah zona waktu tidak ditemukanMemasukkan 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);
sumber
Pertama-tama Anda perlu membuat field Nullable, lalu setelah itu sangat sederhana - alih-alih memberi nilai, masukkan kode ini
CURRENT_TIMESTAMP
.sumber
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
sumber
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.
sumber
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)
sumber