La funzione di estrazione sembra utile e la funzione di data che ho trovato risolve alcuni dei miei problemi, ma c'è un modo per replicare date_trunc di PostgreSQL?
Infatti, EXTRACT
sembra che sarà la corrispondenza più vicina per questo caso specifico.
Il tuo codice originale in PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Usando EXTRACT
:
WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
BETWEEN
EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
AND
EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)
Anche se dovrebbe essere funzionalmente identico, questo in realtà sta trasformando le date in una stringa AAAAMM prima di eseguire il confronto.
Un'altra opzione sarebbe usare DATE_FORMAT
per ricostruire la stringa della data e forzarla all'inizio del mese:
WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
BETWEEN
DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
AND
DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')
Inoltre, tieni presente che MySQL è davvero scarso nel gestire gli intervalli di date, anche quando il campo è indicizzato. Probabilmente ti ritroverai con una scansione completa della tabella se non stai attento.