Sugerowałbym nie zastanawiać się nad tym problemem i po prostu użyć pierwszej daty/godziny miesiąca. Postgres ma wiele funkcji związanych z datami — od date_trunc()
do age()
na + interval
-- do obsługi dat.
Możesz łatwo przekonwertować je na żądany format, uzyskać różnicę między dwiema wartościami i tak dalej.
Jeśli wpiszesz zapytanie jako:
where year_month = date_trunc('month', now()) and user_id = 'adc1-23...'
Następnie może łatwo skorzystać z indeksu na (user_id, year_month)
lub (year_month, user_id)
.