2010-07-29 11 views
10

Per quanto ne so, ora() restituisce lo stesso tempo durante l'intera transazione PostgreSQL? Ma come ottenere reale tempo?Come ottenere un tempo reale nella transazione PostgreSQL?

Inoltre, sono interessato se esiste qualche parametro di configurazione per limitare la durata della transazione, in modo che dopo tale periodo la transazione di scadenza fallirebbe immediatamente o in qualche modo proibire le seguenti query?

+2

Queste due domande sembrano non correlate a me. –

+0

Vorrei limitare l'abuso della durata della transazione, quindi, a seconda della flessibilità della soluzione standard, sceglierei la soluzione personalizzata in base al tempo reale (transazione non riuscita nella stored procedure). Quindi, le domande sono correlate nell'ambito del mio compito. – seas

+0

Non riesco a trovare alcuna documentazione sulla durata della transazione/timeout con rollback. Si potrebbe ottenere qualcosa dai timeout della sessione (e attivare questa transazione in una sessione dedicata), ma non è ancora elegante. Vedrei se la tua soluzione personalizzata spiffy funziona. :) – Tobiasopdenbrouw

risposta

3
Timeofday() 

Può funzionare per voi.

+0

Sì, funziona. Grazie. – seas

+5

Una stranezza deve essere in mente: "timeofday() è una funzione storica di PostgreSQL. Come clock_timestamp(), restituisce l'ora corrente effettiva, ma come una stringa di testo formattata anziché un timestamp con il fuso orario." –

+0

@Milen Grazie per il tuo commento. Dovrebbe essere una risposta da solo in modo da poterlo invogliare :) –

-2

Per limitare il tempo di un'istruzione (non una transazione) è possibile utilizzare statement_timeout. now() incrementerà su ogni esecuzione se non all'interno di un blocco di transazione. Quindi:

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:36.207614-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:36.688054-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:40.407623-07 
(1 row) 

postgres=# begin; 
BEGIN 
postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:43.417611-07 
(1 row) 

postgres=# select now(); 
       now    
------------------------------- 
2010-08-11 13:44:43.417611-07 
(1 row) 

postgres=# 
27

Utilizzare clock_timestamp().

now() è un PostgreSQL tradizionale equivalente a transaction_timestamp(), che equivale a CURRENT_TIMESTAMP. Queste funzioni restituiscono l'ora di inizio della transazione corrente. I loro valori non cambiano durante la transazione.

statement_timestamp() restituisce l'ora di ricezione dell'ultimo messaggio di comando dal client.

clock_timestamp() restituisce l'ora corrente effettiva e pertanto il suo valore cambia anche all'interno di un singolo comando SQL.

Per ulteriori informazioni vedere documentation.

Problemi correlati