Fungsi ekstrak tampaknya berguna dan fungsi tanggal yang saya temukan memecahkan beberapa masalah saya, tetapi apakah ada cara untuk mereplikasi date_trunc PostgreSQL?
Memang, EXTRACT
sepertinya ini akan menjadi yang paling cocok untuk kasus khusus ini.
Kode asli Anda di PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Menggunakan 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)
Meskipun seharusnya identik secara fungsional, ini sebenarnya adalah mengubah tanggal menjadi string YYYYMM sebelum melakukan perbandingan.
Opsi lain adalah menggunakan DATE_FORMAT
untuk membangun kembali string tanggal dan memaksanya ke awal bulan:
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')
Perlu diketahui juga bahwa MySQL sangat buruk dalam menangani rentang tanggal, bahkan ketika bidang diindeks. Anda mungkin akan berakhir dengan pemindaian tabel lengkap jika tidak hati-hati.