No importa para esta simple INSERTdeclaració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.
Jon Heller
@JonHeller ¿Puede mostrar un ejemplo específico de cómo el uso to_timestampcausarí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).
Jeff Holt
@ jeff6times7 Consulte este Gist para obtener una explicación de cómo las variables de vinculación no convertidas pueden superar a las variables de vinculación convertidas. La diferencia probablemente solo importa si los datos están sesgados. Con los tipos de enlaces nativos, Oracle puede comprender mejor los datos y realizar mejores estimaciones en función de los valores.
Depende en cierto modo de dónde proviene el valor que desea insertar. Si desea insertar la hora actual, puede usarla CURRENT_TIMESTAMPcomo 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
Los componentes del formato de tiempo son, espero, autoexplicativos, excepto que eso FF3significa 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 TIMESTAMPcolumna, pero debe comprender las JDBCasignaciones de tipos.
Oracle 11. Campo definido como TIMESTAMP (6) no NULL. Usando timestamp '2019-05-16 10:05:51:19:277401'tengo este error: ORA-01882: región de zona horaria no encontrada
Respuestas:
si desea que se inserte la marca de tiempo actual, entonces:
fuente
TO_DATE
lugar deTO_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 usavalues (: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).CURRENT_TIMESTAMP
ySYSTIMESTAMP
son palabras reservadas de Oracle para este propósito. Son el análogo de marca de tiempo deSYSDATE
.fuente
fuente
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 (oSYSTIMESTAMP
).Si tiene una hora como una cadena y desea convertirla en una marca de tiempo, use una expresión como
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 lasJDBC
asignaciones de tipos.fuente
Prefiero literales de marca de tiempo ANSI:
Más detalles en el manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
fuente
timestamp '2019-05-16 10:05:51:19:277401'
tengo este error: ORA-01882: región de zona horaria no encontradaInsertar fecha en sql
Si supongamos que quisiéramos insertar la fecha del sistema
fuente
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
.fuente
Para mi propia referencia futura:
Con cx_Oracle use cursor.setinputsize (...):
No es necesario convertir en la base de datos. Ver la documentación de Oracle
fuente
Uno puede simplemente usar
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.
fuente
esto funciona para mssql 2012
fuente