La función de extracción parece útil y la función de fecha que he encontrado resuelve algunos de mis problemas, pero ¿hay alguna forma de replicar date_trunc de PostgreSQL?
De hecho, EXTRACT
parece que será la coincidencia más cercana para este caso específico.
Tu código original en 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)
Si bien debería ser funcionalmente idéntico, en realidad está transformando las fechas en una cadena AAAAMM antes de realizar la comparación.
Otra opción sería usar DATE_FORMAT
para reconstruir la cadena de fecha y forzarla al comienzo del mes:
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')
Además, tenga en cuenta que MySQL es realmente pobre en el manejo de rangos de fechas, incluso cuando el campo está indexado. Probablemente terminará con un escaneo completo de la tabla si no tiene cuidado.