Non c'è differenza. Tre citazioni dal manuale:
1)
Queste funzioni standard SQL restituiscono tutti i valori in base all'ora di inizio della transazione corrente:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
è equivalente a CURRENT_TIMESTAMP
, ma è chiamato per riflettere chiaramente ciò che restituisce.
3)
now()
è un tradizionale PostgreSQL equivalente a transaction_timestamp()
.
Enorme enfasi sulla mia. CURRENT_TIMESTAMP
, transaction_timestamp()
E now()
fare esattamente lo stesso. CURRENT_TIMESTAMP
è una stranezza sintattica per una funzione, senza parentesi finali. Questo è secondo lo standard SQL.
Se non si dichiara un alias di colonna per una chiamata di funzione in un'istruzione SQL, l'alias viene impostato automaticamente sul nome della funzione. Internamente, lo standard-SQL CURRENT_TIMESTAMP
è implementato con now()
. Fino a Postgres 9.6 che mostra il nome della colonna risultante , che era "adesso", ma cambiato in "current_timestamp" in Postgres 10.
transaction_timestamp()
fa lo stesso, ma questa è una funzione Postgres corretta, quindi l'alias predefinito è sempre stato "transaction_timestamp".
Do Non confondete una di queste funzioni con la speciale costante di ingresso'now'
. Questo è solo uno dei numerosi short notazionali per specifici valori di data / ora / timestamp, citando il manuale:
... che verranno convertiti in valori di data / ora ordinari durante la lettura. (In particolare, now
e le stringhe correlate vengono convertite in un valore temporale specifico non appena vengono lette.) Tutti questi valori devono essere racchiusi tra virgolette singole quando utilizzati come costanti nei comandi SQL.
Può aggiungere alla confusione che (fino ad almeno Postgres 12) qualsiasi numero di spazi e parentesi ( {[( )]}
) iniziali e finali sia tagliato da quegli speciali valori di input. Quindi 'now()'::timestamptz
- o solo 'now()'
dove non è richiesto alcun cast di tipo esplicito - è anche valido e capita di valutare allo stesso timestamp della funzione now()
nella maggior parte dei contesti . Ma quelle sono costanti e in genere non sono ciò che vuoi come colonna predefinita per esempio.
db <> violino qui
Vecchio violino SQL
Notevoli alternative sono statement_timestamp()
e clock_timestamp()
. Il manuale:
statement_timestamp()
restituisce l'ora di inizio dell'istruzione corrente (in particolare, l'ora di ricezione dell'ultimo messaggio di comando dal client). [...]
clock_timestamp()
restituisce l'ora corrente attuale, e quindi il suo valore cambia anche all'interno di un singolo comando SQL.
Nota: statement_timestamp()
è STABLE
come sopra (restituisce sempre lo stesso valore all'interno dello stesso comando SQL). Ma clock_timestamp()
è necessariamente solo VOLATILE
. La differenza può essere significativa.
where items.createddate > now()
:?