PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

date_trunc do PostgreSQL no mySQL


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.