Como inserir um timestamp no Oracle?

91

Eu tenho um banco de dados Oracle com um timestampcampo nele. Qual é o código SQL correto para inserir um timestampneste campo?

Mike Rifgin
fonte
9
"Não consigo encontrar essa informação em lugar nenhum." A documentação da Oracle é abrangente e online. Encontre aqui: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC

Respostas:

135
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

se você deseja que o carimbo de hora atual seja inserido:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
reggie
fonte
1
Por que em TO_DATEvez de TO_TIMESTAMP?
Dave Costa
Não importa para esta INSERTinstrução simples , mas em geral você não deseja usar variáveis ​​de ligação como esta. A conversão de tipo em sua primeira instrução evita que ela seja sensível ao bind, o que limita a capacidade do Oracle de criar bons planos. O otimizador pode funcionar melhor se você usar em values (:ts_val)vez disso, assumindo: ts_val mapeia diretamente para um carimbo de data / hora.
Jon Heller
@JonHeller Você pode mostrar um exemplo específico de como o uso to_timestampcausaria um plano de execução incorreto para uma instrução SQL planejável? Posso mostrar um exemplo de como não seria. Em vez disso, o que acho que todos nós queremos evitar é a coerção inesperada do tipo de dados que impede o uso de uma operação de origem de linha esperada (ou seja, a ideal).
Jeff Holt
@ jeff6times7 Veja este Síntese para uma explicação de como variáveis ​​de vinculação não convertidas podem superar as variáveis ​​de vinculação convertidas. A diferença provavelmente só importa se os dados estiverem distorcidos. Com os tipos de ligação nativos, o Oracle pode entender melhor os dados e fazer melhores estimativas com base nos valores.
Jon Heller
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPe SYSTIMESTAMPsão palavras reservadas da Oracle para esse fim. Eles são o análogo do carimbo de data / hora SYSDATE.

Quassnoi
fonte
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
fonte
9

Depende de onde vem o valor que você deseja inserir. Se você deseja inserir a hora atual, você pode usar CURRENT_TIMESTAMPcomo mostrado em outras respostas (ou SYSTIMESTAMP).

Se você tem um tempo como uma string e deseja convertê-lo em um carimbo de data / hora, use uma expressão como

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

Os componentes do formato de hora são, espero, autoexplicativos, exceto que FF3 significa 3 dígitos de precisão sub-segundo. Você pode ir até 6 dígitos de precisão.

Se você estiver inserindo de um aplicativo, a melhor resposta pode depender de como o valor de data / hora está armazenado em seu idioma. Por exemplo, você pode mapear certos objetos Java diretamente para uma TIMESTAMPcoluna, mas você precisa entender os JDBCmapeamentos de tipo.

Dave Costa
fonte
4

Eu prefiro literais de carimbo de data / hora ANSI:

insert into the_table 
  (the_timestamp_column)
values 
  (timestamp '2017-10-12 21:22:23');

Mais detalhes no manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

um cavalo sem nome
fonte
Oracle 11. Campo definido como TIMESTAMP (6) não NULL. Usando timestamp '2019-05-16 10:05:51:19:277401', tenho este erro: ORA-01882: região de fuso horário não encontrada
Alex 75
1

Inserindo data em sql

insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');

Suponha que desejamos inserir a data do sistema

insert
into tablename (timestamp_value)
values (sysdate);
Sai Krishna
fonte
0

Primeiramente você precisa tornar o campo Nullable, depois disso tão simples - ao invés de colocar um valor coloque este código CURRENT_TIMESTAMP.

Ahuramazda
fonte
0

Para minha própria referência futura:

Com 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);

Nenhuma conversão no banco de dados necessária. Veja a documentação da Oracle

Mario The Spoon
fonte
0

Pode-se simplesmente usar

INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');

Desta forma, você não terá que se preocupar com a string de formato de data, apenas use o formato de carimbo de data / hora padrão.

Funciona com Oracle 11, não tenho ideia se funciona para versões anteriores do Oracle.

Outro
fonte
-6
CREATE TABLE Table1 (
id int identity(1, 1) NOT NULL,
Somecolmn varchar (5),
LastChanged [timestamp] NOT NULL)

isso funciona para mssql 2012

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