Oracle'da bir zaman damgası nasıl eklenir?


Yanıtlar:


142
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);

1
Neden TO_DATEyerine TO_TIMESTAMP?
Dave Costa

Bu basit 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.
Jon Heller

@JonHeller Kullanmanın 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.
Jeff Holt

@ jeff6times7 Dönüştürülmemiş bağlama değişkenlerinin dönüştürülmüş bağlama değişkenlerinden nasıl daha iyi performans gösterebileceğinin açıklaması için bu Öz'e bakın . Aradaki fark muhtemelen yalnızca verilerin çarpık olması durumunda önemlidir. Yerel bağlama türleri ile Oracle, verileri daha iyi anlayabilir ve değerlere dayalı olarak daha iyi tahminler yapabilir.
Jon Heller

25
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPve SYSTIMESTAMPOracle bu amaç için ayrılmış kelimelerdir. Zaman damgası analoglarıdır SYSDATE.


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

9

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 .



1

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);

0

Her şeyden önce alanı Nullable yapmalısınız, ardından çok basit - bir değer koymak yerine bu kodu koyun CURRENT_TIMESTAMP.


0

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


0

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.


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

bu mssql 2012 için çalışıyor

INSERT INTO Table1 VALUES('hello',DEFAULT)  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.