Não há diferença. Três citações do manual:
1)
Todas essas funções padrão do SQL retornam valores com base no horário de início da transação atual:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
é equivalente a CURRENT_TIMESTAMP
, mas é nomeado para refletir claramente o que retorna.
3)
now()
é um equivalente tradicional do PostgreSQL transaction_timestamp()
.
Negrito ênfase minha. CURRENT_TIMESTAMP
, transaction_timestamp()
E now()
fazer exatamente o mesmo. CURRENT_TIMESTAMP
é uma singularidade sintática para uma função, sem parênteses à direita. Isso está de acordo com o padrão SQL.
Se você não declarar um alias de coluna para uma chamada de função em uma instrução SQL, o alias usará como padrão o nome da função. Internamente, o SQL padrão CURRENT_TIMESTAMP
é implementado com now()
. Até o Postgres 9.6, exibido no nome da coluna resultante , que era "agora", mas alterado para "current_timestamp" no Postgres 10.
transaction_timestamp()
faz o mesmo, mas esta é uma função apropriada do Postgres, portanto o alias padrão sempre foi "transaction_timestamp".
Você não confundir qualquer uma destas funções com o especial constante de entrada'now'
. Essa é apenas uma das várias atalhos notáveis para valores específicos de data / hora / carimbo de data / hora, citando o manual:
... que serão convertidos em valores comuns de data / hora quando lidos. (Em particular, now
as seqüências de caracteres relacionadas e são convertidas em um valor de tempo específico assim que são lidas.) Todos esses valores precisam ser colocados entre aspas simples quando usados como constantes nos comandos SQL.
Isso pode aumentar a confusão de que (até pelo menos o Postgres 12) qualquer número de espaços à esquerda e à direita e colchetes ( {[( )]}
) são aparados a partir desses valores de entrada especiais. Portanto 'now()'::timestamptz
- ou apenas 'now()'
onde nenhum tipo explícito de conversão é necessário - também é válido e passa a ser avaliado com o mesmo registro de data e hora da função now()
na maioria dos contextos . Mas essas são constantes e normalmente não são o que você deseja como padrão da coluna, por exemplo.
db <> violino aqui Violino SQL
velho
Alternativas notáveis são statement_timestamp()
e clock_timestamp()
. O manual:
statement_timestamp()
retorna a hora de início da instrução atual (mais especificamente, a hora do recebimento da última mensagem de comando do cliente). [...]
clock_timestamp()
retorna a hora atual real e, portanto, seu valor muda mesmo dentro de um único comando SQL.
Nota: statement_timestamp()
é STABLE
como o acima (sempre retorna o mesmo valor dentro do mesmo comando SQL). Mas clock_timestamp()
necessariamente é apenas VOLATILE
. A diferença pode ser significativa.
where items.createddate > now()
:?now()
é definidoSTABLE
porque é avaliado com o mesmo valor (a hora de início da transação atual) dentro da mesma transação. No seu exemplo,now()
é executado apenas uma vez (em oposição a,clock_timestamp()
por exemplo).Além disso, eles não têm diferença funcional quando você os usa adequadamente, eles são convertidos de maneira diferente:
'now()'
recongnized (exatamente como'today'
ou'now'
):'CURRENT_TIMESTAMP'
dá erro engraçado de bordas escurase
'transaction_timestamp()'
não é recongizado como carimbo de data / hora com valor tz:Por favor, não pergunte por que você lançaria
'now()' as timestamp
. Vi emwhere timestamp_column = 'now()'
vez dowhere timestamp_column = now()
código das pessoas, então pensei que esse esclarecimento seria um fato engraçado e um bom complemento para a resposta de Erwin.fonte
'now()'
é semelhante à funçãonow()
na superfície, mas não está diretamente relacionada de outra forma.'now'
é uma avaliação constante da hora de início da transação atual . Parênteses à direita são ignorados. A tentativa de transmitir as cordas'CURRENT_TIMESTAMP'
ou'transaction_timestamp()'
detimestamp
maneira semelhante falha, porque isso é apenas um absurdo. Nenhum dos dois está relacionado às funções correspondentes.