Eu tenho uma instrução SQL como esta:
insert into table1 (col1, col2, col3, col4)
select
value1,
value2,
now(),
now()
from
othertable inner join anotherothertable on somecolumn = someothercolumn;
O select
componente desta consulta retornará centenas de milhares de linhas.
Como a chamada se now()
comportará?
- Ele retornará o mesmo valor para todas as inserções de linhas?
- Ele retornará o mesmo valor na mesma inserção, visto que parece ser chamado duas vezes por inserção de linha única?
Quero realizar esta inserção de forma que now()
seja chamada uma vez, e esse valor seja fixo e usado ao inserir todas as linhas e dados. Não tenho certeza se esta consulta se comportará dessa maneira ou não.
Como não há como fazer algo como current_timestamp = now()
no SQL e usar current_timestamp
como argumento no lugar das duas chamadas para now()
, não sei como fazer isso.
Isso está completamente documentado em Funções e Operadores de Data/Hora, mas, essencialmente, seu código está bom se sua intenção for ter o mesmo horário em todas as linhas. Ele retornará o mesmo valor para cada extrato individual ou até mesmo para toda a transação.
Você pode fazer um teste rápido:
As chamadas para funcionar 'agora' na sua instrução retornam o mesmo tempo para todas as linhas da sua instrução. A hora retornada é a hora em que a transação atual foi iniciada, que é no momento da instrução atual ou em uma instrução anterior na transação.
A documentação para isso está no manual do Postgres, 9.9.5. Data/hora atual .
Aqui está um resumo:
Então, você não precisa colocar o tempo em uma 'variável'. Se por algum motivo você ainda quiser fazer isso, você pode isolar o tempo em uma 'variável' com a ajuda de uma expressão de tabela comum (WITH query), sem sair do SQL:
Você pode armazenar o valor em uma nova variável e salvá-lo assim:
Declarar e usar uma variável é a melhor opção IMHO.
Demonstração do DBFiddle