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.