Jak wstawić znacznik czasu w Oracle?


Odpowiedzi:


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

jeśli chcesz wstawić aktualny znacznik czasu, to:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);

1
Dlaczego TO_DATEzamiast TO_TIMESTAMP?
Dave Costa,

Nie ma to znaczenia dla tej prostej INSERTinstrukcji, ale generalnie nie chcesz używać takich zmiennych wiążących. Konwersja typów w pierwszej instrukcji zapobiega wrażliwości na powiązania, co ogranicza zdolność Oracle do tworzenia dobrych planów. Optymalizator może działać lepiej, jeśli values (:ts_val)zamiast tego użyjesz , przy założeniu, że: ts_val mapuje bezpośrednio na znacznik czasu.
Jon Heller

@JonHeller Czy możesz pokazać konkretny przykład tego, jak użycie to_timestampmoże spowodować zły plan wykonania dla planowalnej instrukcji SQL? Mogę pokazać przykład, jak by tego nie było. Zamiast tego uważam, że wszyscy chcemy uniknąć nieoczekiwanego wymuszenia typu danych, które wyklucza użycie oczekiwanej operacji źródła wiersza (tj. Optymalnej).
Jeff Holt

@ jeff6times7 Zapoznaj się z tym streszczeniem, aby uzyskać wyjaśnienie, w jaki sposób nieprzekonwertowane zmienne powiązane mogą przewyższać przekonwertowane zmienne powiązane. Różnica ma prawdopodobnie znaczenie tylko wtedy, gdy dane są wypaczone. Dzięki natywnym typom powiązań Oracle może lepiej zrozumieć dane i dokonywać lepszych szacunków na podstawie wartości.
Jon Heller

24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPi SYSTIMESTAMPsą zastrzeżonymi słowami Oracle do tego celu. Są analogiem znacznika czasu SYSDATE.


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

9

Rodzaj zależy od tego, skąd pochodzi wartość, którą chcesz wstawić. Jeśli chcesz wstawić aktualny czas, możesz użyć, CURRENT_TIMESTAMPjak pokazano w innych odpowiedziach (lub SYSTIMESTAMP).

Jeśli masz czas jako ciąg i chcesz przekonwertować go na znacznik czasu, użyj wyrażenia takiego jak

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

Mam nadzieję, że składniki formatu czasu nie wymagają wyjaśnienia, z tym że FF3oznacza to 3 cyfry z dokładnością do sekundy. Możesz osiągnąć nawet 6 cyfr precyzji.

Jeśli wstawiasz z aplikacji, najlepsza odpowiedź może zależeć od sposobu przechowywania wartości daty / godziny w Twoim języku. Na przykład możesz odwzorować pewne obiekty Java bezpośrednio na TIMESTAMPkolumnę, ale musisz zrozumieć JDBCmapowania typów.



1

Wstawianie daty w sql

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

Załóżmy, że chcieliśmy wstawić datę systemową

insert
into tablename (timestamp_value)
values (sysdate);

0

Przede wszystkim musisz uczynić pole Nullable, a potem tak prostym - zamiast umieszczać wartość, umieść ten kod CURRENT_TIMESTAMP.


0

Na przyszłość:

Z cx_Oracle użyj cursor.setinputsize (...):

mycursor = connection.cursor();

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

Nie potrzeba konwersji w db. Zobacz dokumentację Oracle


0

Można po prostu użyć

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

W ten sposób nie będziesz musiał martwić się ciągiem formatu daty, po prostu użyj domyślnego formatu znacznika czasu.

Działa z Oracle 11, nie mam pojęcia, czy działa z wcześniejszymi wersjami Oracle.


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

działa to w przypadku mssql 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.