A função de extração parece útil e a função de data que encontrei resolve alguns dos meus problemas, mas existe alguma maneira de replicar o date_trunc do PostgreSQL?
De fato,
EXTRACT
parece que vai ser a correspondência mais próxima para este caso específico. Seu código original no 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)
Embora deva ser funcionalmente idêntico, na verdade isso está desmontando as datas em uma string YYYYMM antes de fazer a comparação.
Outra opção seria usar
DATE_FORMAT
para reconstruir a string de data e forçá-la ao início do mês: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')
Além disso, esteja ciente de que o MySQL é muito ruim em lidar com intervalos de datas, mesmo quando o campo é indexado. Você provavelmente terminará com uma varredura completa da tabela se não for cuidadoso.