2012-01-04 17 views
11

Sto convertendo uno script Unix con un comando SQL Transact in un comando PostgreSQL.Selezione di record tra due timestamp

Ho una tabella con record che hanno un campo last_update_time (xtime) e voglio selezionare tutti i record nella tabella che è stata aggiornata in un periodo selezionato.

Dire che l'ora corrente è 05/01/2012 10:00:00 e l'ora selezionata è 04/01/2012 23:55:00. Come faccio a selezionare tutti i record da una tabella che sono stati aggiornati tra queste date. Ho convertito le 2 volte in secondi nello script Unix prima di emettere il comando psql e ho calcolato l'intervallo in secondi tra i 2 periodi.

ho pensato qualcosa di simile

SELECT A,B,C FROM table 
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now(); 

Sto avendo difficoltà a valutare la Parm per la selectedtimeParm - non risolve correttamente.

Nota del redattore: Non ho cambiato un utilizzo improprio dei termini period, time frame, time e date per il tipo datetime timestamp perché discuto che nella mia risposta.

risposta

24

Cosa c'è di sbagliato:

SELECT a,b,c 
FROM table 
WHERE xtime BETWEEN '2012-04-01 23:55:00'::timestamp 
       AND now()::timestamp; 

Se si vuole operare con un conteggio di secondi come interval:

... 
WHERE xtime BETWEEN now()::timestamp - (interval '1s') * $selectedtimeParm 
       AND now()::timestamp; 

nota, come ho usato il formato data ISO 8601 standard di YYYY-MM-DD h24:mi:ss che non è ambiguo con le impostazioni locali o con l'impostazione DateStyle.

Si noti inoltre che il primo valore per il costrutto BETWEEN deve essere il più piccolo. Se non sai quale valore è più piccolo usa invece BETWEEN SYMMETRIC.

Nella domanda si fa riferimento al tipo di datetime timestamp come "data", "ora" e "periodo". Nel titolo hai usato il termine "time frames", che ho cambiato in "timestamp". Tutti questi termini sono sbagliati. Liberamente scambiarli rende la domanda ancora più difficile da capire.

Questo, e il fatto che abbia codificato solo la domanda psql (il problema riguarda quasi solo il terminale della riga di comando) potrebbe aiutare a spiegare perché nessuno ha risposto per giorni. Normalmente, è una questione di minuti da queste parti. Ho avuto difficoltà a capire la tua domanda, ho dovuto leggerlo un paio di volte.

è necessario capire i tipi di dati date, interval, time e timestamp - con o senza fuso orario. Inizia leggendo il capitolo "Date/Time Types" in the manual.

Anche il messaggio di errore sarebbe andato molto lontano.

+0

Ho trovato la mia risposta: selezionare * da TABLE dove tempo_crizione TRA $ from_datetime AND NOW(); Grazie – Sharon

Problemi correlati