Mam bazę danych Oracle z timestamp
polem. Jaki jest poprawny kod SQL do wstawienia timestamp
w to pole?
Mam bazę danych Oracle z timestamp
polem. Jaki jest poprawny kod SQL do wstawienia timestamp
w to pole?
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);
TO_DATE
zamiast TO_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śli values (: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).
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 (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 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.
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
timestamp '2019-05-16 10:05:51:19:277401'
Mam ten błąd: ORA-01882: nie znaleziono regionu strefy czasowej
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);
Przede wszystkim musisz uczynić pole Nullable, a potem tak prostym - zamiast umieszczać wartość, umieść ten kod CURRENT_TIMESTAMP
.
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
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.