Функцията за извличане изглежда полезна и функцията за дата, която открих, решава някои от проблемите ми, но има ли някакъв начин да се репликира date_trunc на PostgreSQL?
Наистина, EXTRACT
изглежда, че ще бъде най-близкото съответствие за този конкретен случай.
Вашият оригинален код в PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Използване на 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)
Въпреки че трябва да е функционално идентичен, това всъщност е преобразуване на датите в низ ГГГГММ, преди да се направи сравнението.
Друга опция би била използването на DATE_FORMAT
за да възстановите низа от дата и да го принудите към началото на месеца:
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')
Също така, имайте предвид, че MySQL наистина не се справя с периоди от време, дори когато полето е индексирано. Вероятно ще завършите с пълно сканиране на таблицата, ако не внимавате.