Funkcja ekstraktu wydaje się przydatna, a funkcja date, którą znalazłem, rozwiązuje niektóre z moich problemów, ale czy istnieje sposób na zreplikowanie date_trunc w PostgreSQL?
Rzeczywiście, EXTRACT
wygląda na to, że będzie to najbliższe dopasowanie w tym konkretnym przypadku.
Twój oryginalny kod w PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Korzystanie z 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)
Chociaż powinno być funkcjonalnie identyczne, w rzeczywistości jest to zniekształcanie dat w ciąg RRRRMM przed wykonaniem porównania.
Inną opcją byłoby użycie DATE_FORMAT
aby odbudować ciąg daty i wymusić go na początku miesiąca:
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')
Należy również pamiętać, że MySQL naprawdę słabo radzi sobie z zakresami dat, nawet gdy pole jest indeksowane. Jeśli nie będziesz ostrożny, prawdopodobnie skończysz z pełnym skanowaniem tabeli.