Aggiunta di un parametro data

Spesso si desidera estrarre dati per un periodo di tempo specifico. È possibile farlo codificando nel codice il periodo di tempo nella query stessa, ma per rendere il report più a prova di futuro è possibile aggiungere un parametro di data:

Questa query è progettata per contare il numero totale di post in ciascuna categoria (esclusi post e argomenti eliminati, messaggi privati e argomenti senza categoria) creati entro un intervallo di date specifico, quindi ordinare le categorie per numero totale di post in ordine decrescente.

-- [params]
-- date :start_date -- Questo è un parametro per la data di inizio dell'intervallo
-- date :end_date -- Questo è un parametro per la data di fine dell'intervallo

SELECT
   t.category_id,
   COUNT(p.id) AS "Total Posts" -- Conta il numero di post in ciascuna categoria
FROM posts p
  JOIN topics t ON t.id = p.topic_id
WHERE p.created_at::date BETWEEN :start_date AND :end_date -- Filtra i post creati tra la data di inizio e la data di fine (::date converte il timestamp di created_at in una data)
  AND t.deleted_at IS NULL
  AND p.deleted_at IS NULL
  AND t.archetype <> 'private message'
  AND p.user_id > 0
  AND t.category_id IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC

L’utilizzo dello stile di parametro date anziché string rende l’inserimento del valore del parametro molto più intuitivo, soprattutto quando viene condiviso con altri.

Un altro suggerimento degno di nota per questo tipo di query è quello di convertire created_at in una data. Poiché il valore è memorizzato nel database come timestamp, se non lo si converte in una data, la query non recupererà i risultati dalla data di :end_date stessa.

È possibile verificare quali valori sono memorizzati come timestamp utilizzando l’albero di Explorer:

Questa query è principalmente un esempio per dimostrare i principi. Speriamo che la trovi utile, ma in caso di domande, chiedi pure qui sotto. :slight_smile:

9 Mi Piace
PG::SyntaxError: ERRORE:  errore di sintassi o vicino a \":\"\nLINEA 16: WHERE p.created_at::date BETWEEN :start_date AND :end_date -…

:tired_face:

4 Mi Piace

Ah sì, non gradisce quei commenti inline accanto ai parametri.

-- [params]
-- date :start_date 
-- date :end_date 

SELECT
   t.category_id,
   COUNT(p.id) AS "Total Posts" -- Conta il numero di post in ogni categoria
FROM posts p 
  JOIN topics t ON t.id = p.topic_id 
WHERE p.created_at::date BETWEEN :start_date AND :end_date -- Filtra i post creati tra la data di inizio e la data di fine (::date converte il timestamp di created_at in una data)
  AND t.deleted_at IS NULL 
  AND p.deleted_at IS NULL 
  AND t.archetype <> 'private message' 
  AND p.user_id > 0
  AND t.category_id IS NOT NULL 
GROUP BY 1 
ORDER BY 2 DESC

Questo sembra funzionare meglio. :+1: (Potrebbe essere necessario aggiornare la pagina la prima volta per visualizzare le caselle di immissione dei parametri)

Grazie per avermi aiutato a correggere le guide. :slight_smile: :trophy:

7 Mi Piace