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);
reggie
źródło
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.

Quassnoi
źródło
20
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
Kash
źródło
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.

Dave Costa
źródło
4

Preferuję literały sygnatury czasowej ANSI:

insert into the_table 
  (the_timestamp_column)
values 
  (timestamp '2017-10-12 21:22:23');

Więcej szczegółów w instrukcji: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

koń bez imienia
źródło
Oracle 11. Pole zdefiniowane jako TIMESTAMP (6) nie NULL. Używając timestamp '2019-05-16 10:05:51:19:277401'Mam ten błąd: ORA-01882: nie znaleziono regionu strefy czasowej
Alex 75
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);
Sai Krishna
źródło
0

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

Ahuramazda
źródło
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

Mario łyżka
źródło
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.

Jeszcze
źródło
-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)  
VGuest
źródło