2013-10-27 18 views
9

Ho un database PostgreSQL in cui una tabella cresce rapidamente molto grande (diverse milioni di righe al mese o giù di lì) quindi mi piacerebbe archiviare periodicamente il contenuto di quella tabella in una tabella separata .Ottieni il timestamp di un mese fa in PostgreSQL

Ho intenzione di utilizzare un processo cron per eseguire un file .sql ogni notte per archiviare tutte le righe che sono più vecchie di un mese nell'altra tabella.

Ho la query funzionante, ma ho bisogno di sapere come creare dinamicamente un timestamp del mese precedente.

La colonna time è memorizzata nel formato 2013-10-27 06:53:12 e devo sapere cosa utilizzare in una query SQL per creare un timestamp esattamente un mese prima. Ad esempio, se oggi è 27 Ott 2013, voglio che la query per abbinare tutte le righe in cui il tempo < 2013-09-27 00:00:00

+1

"La colonna dell'ora è memorizzata nel formato 2013-10-27 06:53:12" - è necessario utilizzare una colonna ['timestamp'] (http://www.postgresql.org/docs/current/interactive /datatype-datetime.html) per quello, non una stringa formattata, poiché renderà le cose come questa molto più semplici ed efficienti. – IMSoP

+0

"30 giorni" è più preciso di "un mese" e "esattamente un mese" è sostanzialmente priva di significato. In SQL, se sottrai esattamente un mese dal 2013-03-28, 03-29, 03-30 e 03-31 e ottieni la stessa risposta: 2013-02-28. È importante? –

+0

@IMSoP Sfortunatamente, non ho il controllo sulla struttura del database. Sto eseguendo un Quassel IRC Core e avendo 18 milioni di righe nella tabella del backlog, il caricamento del client è molto lento, quindi ho bisogno di archiviare tutte le righe tranne quelle recenti per mantenere la stabilità del client. –

risposta

18

domanda è stato risposto con un amico in IRC:

'now'::timestamp - '1 month'::interval

Avere il ritorno timestamp 00:00:00 non era terribile importante, quindi questo funziona per le mie intenzioni.

+2

+1 questo funziona anche in Redshift – fortran

26
select date_trunc('day', NOW() - interval '1 month') 

Questa query data ritorneremo un mese fa da ora e rotondo il tempo di 0:00:00.

+1

Si noti che questo restituirà un timestamp effettivo; dal testo della domanda, la colonna attuale ha una stringa, quindi dovrai eseguire il cast per confrontare: 'WHERE CAST (" time "come timestamp) IMSoP

Problemi correlati