Extraktfunktionen verkar användbar och datumfunktionen jag har hittat löser några av mina problem, men finns det något sätt att replikera PostgreSQL:s date_trunc?
Faktum är att EXTRACT
ser ut som att det kommer att vara den närmaste matchen för det här specifika fallet.
Din ursprungliga kod i PG:
WHERE date_trunc('month', QUERY_DATE) BETWEEN
date_trunc('month', now()) - INTERVAL '4 MONTH' AND
date_trunc('month', now() - INTERVAL '1 WEEK')
Använder 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)
Även om det borde vara funktionellt identiskt, är detta faktiskt att mangla datumen till en ÅÅÅÅMM-sträng innan jämförelsen görs.
Ett annat alternativ skulle vara att använda DATE_FORMAT
för att bygga om datumsträngen och tvinga den till början av månaden:
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')
Tänk också på att MySQL är riktigt dålig på att hantera datumintervall, även när fältet är indexerat. Du kommer förmodligen att sluta med en genomsökning av hela tabellen om du inte är försiktig.