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.
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
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.
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
Odpowiedzi:
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);
źródło
TO_DATE
zamiastTO_TIMESTAMP
?INSERT
instrukcji, 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ślivalues (:ts_val)
zamiast tego użyjesz , przy założeniu, że: ts_val mapuje bezpośrednio na znacznik czasu.to_timestamp
moż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).INSERT INTO mytable (timestamp_field) VALUES (CURRENT_TIMESTAMP)
CURRENT_TIMESTAMP
iSYSTIMESTAMP
są zastrzeżonymi słowami Oracle do tego celu. Są analogiem znacznika czasuSYSDATE
.źródło
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
źródło
Rodzaj zależy od tego, skąd pochodzi wartość, którą chcesz wstawić. Jeśli chcesz wstawić aktualny czas, możesz użyć,
CURRENT_TIMESTAMP
jak pokazano w innych odpowiedziach (lubSYSTIMESTAMP
).Jeśli masz czas jako ciąg i chcesz przekonwertować go na znacznik czasu, użyj wyrażenia takiego jak
Mam nadzieję, że składniki formatu czasu nie wymagają wyjaśnienia, z tym że
FF3
oznacza 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
TIMESTAMP
kolumnę, ale musisz zrozumiećJDBC
mapowania typów.źródło
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
źródło
timestamp '2019-05-16 10:05:51:19:277401'
Mam ten błąd: ORA-01882: nie znaleziono regionu strefy czasowejWstawianie 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);
źródło
Przede wszystkim musisz uczynić pole Nullable, a potem tak prostym - zamiast umieszczać wartość, umieść ten kod
CURRENT_TIMESTAMP
.źródło
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
źródło
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.
źródło
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)
źródło