Capturar o inicio e o fim do mes anterior

Olá pessoal, estou com dificuldades para programar uma logica para um relatório, pois a data tem que ser dinâmica. No caso ela tem que capturar duas datas, a data do inicio do mês passado e fim do mês passado. Essas duas strings eu vou usar em uma query dentro da clausula Between.

O que estou usando via sql não esta funcionando por isso pensei em pegar via javascript

AND TRUNC(data_exame) BETWEEN TO_DATE('01'|| TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE, -1)), 'MM/YYYY')) AND LAST_DAY(ADD_MONTHS(SYSDATE, -1))

O resultado do between deveria ser 01/12/2021 e 31/12/2021. Más não esta funcionando.

Tente isso:

const date = new Date();
const currMonth = date.getMonth();
const previousMonth = currMonth - 1;

const firstDay = new Date(date.getFullYear(), previousMonth, 1);
const lastDay = new Date(date.getFullYear(), previousMonth + 1, 0);

console.log(firstDay);
console.log(lastDay);

Mas as datas estão certas, o problema é o horário. Na data final ele gera 31 de dezembro, mas no horário atual (que ele pega do sysdate).

Como está buscando entre duas datas com BETWEEN, o ideal seria fazer a data inicial com horário meia-noite e a data final com horário 23:59:59.

Na data inicial já está correto (o horário é meia-noite), mas tem outro jeito mais simples de fazer (aliás, que banco é esse? é Oracle?):

TRUNC(data_exame) BETWEEN
    TRUNC(ADD_MONTHS(sysdate, -1), 'MM') AND
    TRUNC(LAST_DAY(ADD_MONTHS(SYSDATE, -1)), 'DD') + 1 - INTERVAL '1' SECOND

Assim, a busca é feita entre 1 de dezembro à meia-noite e 31 de dezembro às 23:59:59.

Se ainda não funcionar, pode ser algum outro problema na query (e nesse caso, seria bom você mostrar alguns dados de exemplo e qual deveria ser o resultado, senão a gente não consegue testar e nem adivinhar qual é o problema).

De qualquer forma, não precisa gerar no JavaScript nem nada disso, dá pra se virar só com as funções do próprio banco.