Hàm trích xuất có vẻ hữu ích và hàm ngày mà tôi đã tìm thấy giải quyết được một số vấn đề của tôi, nhưng có cách nào để sao chép date_trunc của PostgreSQL không?
Thật vậy, EXTRACT
có vẻ như đây sẽ là kết quả phù hợp nhất cho trường hợp cụ thể này.
Mã gốc của bạn trong PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Sử dụng 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)
Mặc dù nó phải giống hệt nhau về mặt chức năng, nhưng điều này thực sự đang trộn các ngày tháng thành một chuỗi YYYYMM trước khi thực hiện so sánh.
Một tùy chọn khác sẽ được sử dụng DATE_FORMAT
để xây dựng lại chuỗi ngày và buộc nó vào đầu tháng:
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')
Ngoài ra, hãy lưu ý rằng MySQL thực sự kém trong việc xử lý các phạm vi ngày, ngay cả khi trường được lập chỉ mục. Có thể bạn sẽ phải quét toàn bộ bảng nếu không cẩn thận.