Eu tenho um banco de dados Oracle com um timestampcampo nele. Qual é o código SQL correto para inserir um timestampneste campo?
Eu tenho um banco de dados Oracle com um timestampcampo nele. Qual é o código SQL correto para inserir um timestampneste campo?
Respostas:
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);
TO_DATEvez de TO_TIMESTAMP?
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.
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).
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.
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
timestamp '2019-05-16 10:05:51:19:277401', tenho este erro: ORA-01882: região de fuso horário não encontrada
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);
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.
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
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.