sql >> Base de Datos >  >> RDS >> PostgreSQL

date_trunc de PostgreSQL en mySQL

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.