No PostgreSQL, uso a função now()
and current_timestamp
e não vejo diferença:
# SELECT now(), current_timestamp;
now | now
--------------------------------+--------------------------------
04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)
Estou esquecendo de algo?
Não há diferença . Três citações do manual:
1.
Minha ênfase em negrito .
CURRENT_TIMESTAMP
,transaction_timestamp()
enow()
faça exatamente o mesmo.CURRENT_TIMESTAMP
é uma estranheza sintática para uma função, não tendo par de 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 será padronizado para o nome da função. Internamente, o SQL padrão
CURRENT_TIMESTAMP
é implementado comnow()
. Até o Postgres 9.6 que aparece no nome da coluna resultante , que era "now", mas mudou para "current_timestamp" no Postgres 10.transaction_timestamp()
faz o mesmo, mas esta é uma função apropriada do Postgres, então o alias padrão sempre foi "transaction_timestamp".Não confunda nenhuma dessas funções com a constante de entrada
'now'
especial . Esse é apenas um dos vários atalhos de notação para valores específicos de data/hora/timestamp, citando o manual:Pode aumentar a confusão que (até pelo menos Postgres 12) qualquer número de espaços e colchetes à esquerda e à direita (
{[( )]}
) são cortados desses valores de entrada especiais. Então'now()'::timestamptz
- ou apenas'now()'
onde nenhuma conversão de tipo explícito é necessária - também é válida e acontece para avaliar o mesmo timestamp que a funçãonow()
na maioria dos contextos . Mas essas são constantes e normalmente não o que você deseja como padrão de coluna, por exemplo.db<>fiddle aqui
Velho sqlfiddle
Alternativas notáveis são
statement_timestamp()
eclock_timestamp()
. O manual:Nota:
statement_timestamp()
éSTABLE
como o acima (sempre retorna o mesmo valor dentro do mesmo comando SQL). Masclock_timestamp()
necessariamente é apenasVOLATILE
. A diferença pode ser significativa.Além de não terem diferença funcional quando você os usa corretamente, eles são lançados de forma diferente:
'now()'
reconhecido (como'today'
ou'now'
):'CURRENT_TIMESTAMP'
dá erro engraçado de bordas escurase
'transaction_timestamp()'
simplesmente não é recongized como timestamp com valor tz:Por favor, não pergunte por que você lançaria
'now()' as timestamp
. Eu viwhere timestamp_column = 'now()'
em vez dewhere timestamp_column = now()
no código das pessoas, então pensei que esse esclarecimento seria um fato engraçado e uma boa adição à resposta de Erwin.