Suggerirei di non pensare troppo al problema e di utilizzare semplicemente la prima data/ora del mese. Postgres ha molte funzioni specifiche per la data -- da date_trunc()
a age()
a + interval
-- per supportare le date.
Puoi convertirli prontamente nel formato che desideri, ottenere la differenza tra due valori e così via.
Se esprimi la tua domanda come:
where year_month = date_trunc('month', now()) and user_id = 'adc1-23...'
Quindi può facilmente sfruttare un indice su (user_id, year_month)
o (year_month, user_id)
.