2013-02-08 14 views
13

Ho una tabella che memorizza i registri di accesso/visualizzazione degli utenti per il servizio web che corro. Traccia il tempo come un timestamp anche se trovo quando faccio report aggregati mi interessa solo il giorno, non il tempo.Indicatori di data e ora di raggruppamento per giorno, non per ora

Sono attualmente in esecuzione la seguente query:

SELECT user_logs.timestamp 
    FROM user_logs 
     WHERE user_logs.timestamp >= %(timestamp_1)s 
      AND user_logs.timestamp <= %(timestamp_2)s 
       ORDER BY user_logs.timestamp 

spesso Ci sono altri in cui le condizioni ma non dovrebbe questione alla domanda. Sto usando Postgres ma assumerei che qualsiasi funzione utilizzata funzioni in altre lingue.

Estraggo i risultati in uno script Python che conta il numero di visualizzazioni per data, ma per me avrebbe molto più senso se il database potesse raggrupparsi e contare per me.

Come faccio a spogliarlo in modo che possa raggruppare entro il giorno e ignorare l'ora?

risposta

28
SELECT date_trunc('day', user_logs.timestamp) "day", count(*) views 
FROM user_logs 
WHERE user_logs.timestamp >= %(timestamp_1)s 
    AND user_logs.timestamp <= %(timestamp_2)s 
group by 1 
ORDER BY 1 
+21

Collegamento a PostgreSQL: 'user_logs.timestamp :: date' invece di' date_trunc ('day', user_logs.timestamp) '. –

+0

Grazie a entrambi :) – Teifion

+4

@Igor Si noti che un cast per ':: date' perde le informazioni sul fuso orario mentre' date_trunc' no. Ciò potrebbe essere importante quando si desidera confrontare lo stesso giorno per due anni e quel giorno è cambiato da un fuso orario a un altro. –