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.
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
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.
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
Respostas:
se você deseja que o carimbo de hora atual seja inserido:
fonte
TO_DATE
vez deTO_TIMESTAMP
?INSERT
instruçã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 emvalues (:ts_val)
vez disso, assumindo: ts_val mapeia diretamente para um carimbo de data / hora.to_timestamp
causaria 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).CURRENT_TIMESTAMP
eSYSTIMESTAMP
são palavras reservadas da Oracle para esse fim. Eles são o análogo do carimbo de data / horaSYSDATE
.fonte
fonte
Depende de onde vem o valor que você deseja inserir. Se você deseja inserir a hora atual, você pode usar
CURRENT_TIMESTAMP
como mostrado em outras respostas (ouSYSTIMESTAMP
).Se você tem um tempo como uma string e deseja convertê-lo em um carimbo de data / hora, use uma expressão como
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
TIMESTAMP
coluna, mas você precisa entender osJDBC
mapeamentos de tipo.fonte
Eu prefiro literais de carimbo de data / hora ANSI:
Mais detalhes no manual: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
fonte
timestamp '2019-05-16 10:05:51:19:277401'
, tenho este erro: ORA-01882: região de fuso horário não encontradaInserindo data em sql
Suponha que desejamos inserir a data do sistema
fonte
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
.fonte
Para minha própria referência futura:
Com cx_Oracle use cursor.setinputsize (...):
Nenhuma conversão no banco de dados necessária. Veja a documentação da Oracle
fonte
Pode-se simplesmente usar
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.
fonte
isso funciona para mssql 2012
fonte