Ho un database Oracle con un timestamp
campo in esso. Qual è il codice SQL corretto per inserire un timestamp
in questo campo?
Ho un database Oracle con un timestamp
campo in esso. Qual è il codice SQL corretto per inserire un timestamp
in questo campo?
Risposte:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
se si desidera inserire il timestamp corrente, allora:
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATE
invece di TO_TIMESTAMP
?
INSERT
istruzione, ma in generale non vuoi usare variabili di bind come questa. La conversione del tipo nella prima istruzione impedisce che sia sensibile al bind, il che limita la capacità di Oracle di creare buoni piani. L'ottimizzatore potrebbe funzionare meglio se si utilizza values (:ts_val)
invece, supponendo che: ts_val venga mappato direttamente a un timestamp.
to_timestamp
causerebbe un piano di esecuzione errato per un'istruzione SQL pianificabile? Posso mostrare un esempio di come non lo sarebbe. Invece, quello che penso che tutti noi vogliamo evitare è la coercizione inaspettata del tipo di dati che preclude l'utilizzo di un'operazione di origine riga prevista (cioè quella ottimale).
Il tipo dipende da dove proviene il valore che si desidera inserire. Se vuoi inserire l'ora corrente puoi usare CURRENT_TIMESTAMP
come mostrato in altre risposte (o SYSTIMESTAMP
).
Se hai un tempo come stringa e desideri convertirlo in un timestamp, usa un'espressione come
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
I componenti del formato dell'ora sono, spero, autoesplicativi, tranne per questo FF3
significa 3 cifre di precisione inferiore al secondo. Puoi arrivare fino a 6 cifre di precisione.
Se stai inserendo da un'applicazione, la risposta migliore potrebbe dipendere da come il valore di data / ora è memorizzato nella tua lingua. Ad esempio, è possibile mappare determinati oggetti Java direttamente su una TIMESTAMP
colonna, ma è necessario comprendere le JDBC
mappature dei tipi.
Preferisco i letterali timestamp ANSI:
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
Maggiori dettagli nel manuale: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'
ho questo errore: ORA-01882: regione del fuso orario non trovata
Inserimento della data in sql
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Supponiamo di voler inserire la data di sistema
insert
into tablename (timestamp_value)
values (sysdate);
Prima di tutto devi rendere il campo Nullable, poi così semplice - invece di mettere un valore metti questo codice CURRENT_TIMESTAMP
.
Per mio riferimento futuro:
Con cx_Oracle usa cursor.setinputsize (...):
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
Nessuna conversione nel db necessaria. Vedere la documentazione Oracle
Si può semplicemente usare
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
In questo modo non dovrai preoccuparti della stringa del formato della data, utilizza semplicemente il formato di timestamp predefinito.
Funziona con Oracle 11, non ho idea se funziona per le versioni precedenti di Oracle.