Saya memiliki Oracle DB dengan timestampbidang di dalamnya. Apa kode SQL yang benar untuk disisipkan timestampke bidang ini?
Saya memiliki Oracle DB dengan timestampbidang di dalamnya. Apa kode SQL yang benar untuk disisipkan timestampke bidang ini?
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);
TO_DATEbukan TO_TIMESTAMP?
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.
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).
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.
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
timestamp '2019-05-16 10:05:51:19:277401'Saya memiliki kesalahan ini: ORA-01882: wilayah zona waktu tidak ditemukan
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);
Pertama-tama Anda perlu membuat field Nullable, lalu setelah itu sangat sederhana - alih-alih memberi nilai, masukkan kode ini CURRENT_TIMESTAMP.
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
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.