timestampİçinde alan olan bir Oracle DB var. timestampBu alana a eklemek için doğru SQL kodu nedir ?
timestampİçinde alan olan bir Oracle DB var. timestampBu alana a eklemek için doğru SQL kodu nedir ?
Yanıtlar:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
geçerli zaman damgasının eklenmesini istiyorsanız, o zaman:
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATEyerine TO_TIMESTAMP?
INSERTifade için önemli değil , ancak genel olarak bu gibi bağlama değişkenlerini kullanmak istemezsiniz. İlk ifadenizdeki tür dönüşümü, bunun bağlamaya duyarlı olmasını engeller ve bu da Oracle'ın iyi planlar oluşturma yeteneğini sınırlar. Bunun yerine optimize edici values (:ts_val)kullanırsanız, şunu varsayarsak daha iyi çalışabilir : ts_val doğrudan bir zaman damgasına eşlenir.
to_timestampplanlanabilir bir SQL deyimi için kötü bir yürütme planına neden olacağına dair belirli bir örnek gösterebilir misiniz ? Nasıl olmayacağına dair bir örnek gösterebilirim. Bunun yerine, hepimizin kaçınmak istediğini düşündüğüm şey, beklenen bir satır kaynağı işlemini (yani, en uygun olanı) kullanmayı engelleyen beklenmedik veri türü zorlamasıdır.
Tür, eklemek istediğiniz değerin nereden geldiğine bağlıdır. Geçerli saati eklemek isterseniz, CURRENT_TIMESTAMPdiğer cevaplarda (veya SYSTIMESTAMP) gösterildiği gibi kullanabilirsiniz .
Dize olarak bir zamanınız varsa ve bunu bir zaman damgasına dönüştürmek istiyorsanız, gibi bir ifade kullanın
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
Zaman formatı bileşenleri, umarım, FF33 basamaklı saniye altı hassasiyet anlamına gelir , kendi kendini açıklar . 6 basamaklı hassasiyete kadar çıkabilirsiniz.
Bir uygulamadan ekliyorsanız, en iyi cevap, tarih / saat değerinin kendi dilinizde nasıl saklandığına bağlı olabilir. Örneğin, belirli Java nesnelerini doğrudan bir TIMESTAMPsütuna eşleyebilirsiniz , ancak JDBCtür eşlemelerini anlamanız gerekir .
ANSI zaman damgası değişmezlerini tercih ederim:
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
Kılavuzda daha fazla ayrıntı: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'bu hatayı var: ORA-01882: zaman dilimi bölge bulunamadı
Sql'ye tarih girme
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Sistem tarihini eklemek istediğimizi varsayalım
insert
into tablename (timestamp_value)
values (sysdate);
Her şeyden önce alanı Nullable yapmalısınız, ardından çok basit - bir değer koymak yerine bu kodu koyun CURRENT_TIMESTAMP.
Gelecekteki referansım için:
Cx_Oracle ile cursor.setinputsize (...) kullanın:
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
Veri tabanında dönüştürme gerekmez. Oracle Belgelerine Bakın
Biri basitçe kullanabilir
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
Bu şekilde, tarih biçimi dizesi hakkında endişelenmenize gerek kalmaz, yalnızca varsayılan zaman damgası biçimini kullanın.
Oracle 11 ile çalışır, önceki Oracle sürümleri için işe yarayıp yaramayacağı hakkında hiçbir fikrim yok.