¿Cómo insertar una marca de tiempo en Oracle?

Respuestas:

135
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);
reggie
fuente
1
¿Por qué en TO_DATElugar de TO_TIMESTAMP?
Dave Costa
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.
Jon Heller
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPy SYSTIMESTAMPson palabras reservadas de Oracle para este propósito. Son el análogo de marca de tiempo de SYSDATE.

Quassnoi
fuente
19
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
Kash
fuente
9

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

to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')

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.

Dave Costa
fuente
4

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

un caballo sin nombre
fuente
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
Alex 75
1

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);
Sai Krishna
fuente
0

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.

Ahuramazda
fuente
0

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

Mario la cuchara
fuente
0

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.

Más
fuente
-6
CREATE TABLE Table1 (
id int identity(1, 1) NOT NULL,
Somecolmn varchar (5),
LastChanged [timestamp] NOT NULL)

esto funciona para mssql 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
VGuest
fuente