Tengo una base de datos de Oracle con un timestamp
campo. ¿Cuál es el código SQL correcto para insertar timestamp
en este campo?
Tengo una base de datos de Oracle con un timestamp
campo. ¿Cuál es el código SQL correcto para insertar timestamp
en este campo?
Respuestas:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));
si desea que se inserte la marca de tiempo actual, entonces:
insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
TO_DATE
lugar de TO_TIMESTAMP
?
INSERT
declaración, pero en general no desea usar variables de vinculación como esta. La conversión de tipo en su primera declaración evita que sea sensible a la vinculación, lo que limita la capacidad de Oracle para crear buenos planes. El optimizador puede funcionar mejor si lo usa values (:ts_val)
en su lugar, asumiendo: ts_val se asigna directamente a una marca de tiempo.
to_timestamp
causaría un plan de ejecución incorrecto para una declaración SQL planificable? Puedo mostrar un ejemplo de cómo no sería así. En cambio, lo que creo que todos queremos evitar es la coerción inesperada del tipo de datos que excluye el uso de una operación de origen de fila esperada (es decir, la óptima).
Depende en cierto modo de dónde proviene el valor que desea insertar. Si desea insertar la hora actual, puede usarla CURRENT_TIMESTAMP
como se muestra en otras respuestas (o SYSTIMESTAMP
).
Si tiene una hora como una cadena y desea convertirla en una marca de tiempo, use una expresión como
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
Los componentes del formato de tiempo son, espero, autoexplicativos, excepto que eso FF3
significa 3 dígitos de precisión inferior a un segundo. Puede llegar a 6 dígitos de precisión.
Si está insertando desde una aplicación, la mejor respuesta puede depender de cómo se almacena el valor de fecha / hora en su idioma. Por ejemplo, puede asignar ciertos objetos Java directamente a una TIMESTAMP
columna, pero debe comprender las JDBC
asignaciones de tipos.
Prefiero literales de marca de tiempo ANSI:
insert into the_table
(the_timestamp_column)
values
(timestamp '2017-10-12 21:22:23');
Más detalles en el manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
timestamp '2019-05-16 10:05:51:19:277401'
tengo este error: ORA-01882: región de zona horaria no encontrada
Insertar fecha en sql
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
Si supongamos que quisiéramos insertar la fecha del sistema
insert
into tablename (timestamp_value)
values (sysdate);
En primer lugar, debe hacer que el campo sea anulable y luego tan simple, en lugar de poner un valor, ponga este código CURRENT_TIMESTAMP
.
Para mi propia referencia futura:
Con cx_Oracle use cursor.setinputsize (...):
mycursor = connection.cursor();
mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
No es necesario convertir en la base de datos. Ver la documentación de Oracle
Uno puede simplemente usar
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
De esta manera, no tendrá que preocuparse por la cadena de formato de fecha, solo use el formato de marca de tiempo predeterminado.
Funciona con Oracle 11, no tengo idea si lo hace para versiones anteriores de Oracle.