Questão de Banco de Dados — PL/SQL e Outras Extensões SQL — FUNDATEC 2025
- Código
- qa699059
- Banca
- FUNDATEC
- Órgão
- PROCERGS
- Ano
- 2025
- Cargo
- ANC ( )
- A-4
- B-3
- C3
- D4
- EApresenta erro de sintaxe
GabaritoB — -3
Gabarito: letra B — a conta chega a -3 — alternativa B.
MONTHS_BETWEEN é uma função do Oracle que calcula quantos meses existem entre duas datas. Ela devolve um número com casas decimais, porque considera a fração do mês baseada nos dias. Se a primeira data for anterior à segunda, o resultado é negativo; se for posterior, positivo.
A função faz a diferença data1 - data2 em meses. Para isso, o Oracle conta os meses completos e depois soma a fração de dias restante dividida por 31 (o número médio de dias considerado). Por isso, o resultado não é um inteiro, mas um valor com decimais. Quando esse valor é guardado em uma variável NUMBER(p), o Oracle arredonda para caber na precisão definida.
Esta questão testa dois pontos: a ordem dos argumentos (que torna o resultado negativo) e o efeito do tipo NUMBER(2), que arredonda o valor fracionário para um inteiro.
V_DATE1 = TO_DATE('2025-03-27', 'YYYY-MM-DD')
V_DATE2 = TO_DATE('2025-07-05', 'YYYY-MM-DD')
V_NUMBER declarado como NUMBER(2)
O que queremos: o valor exibido por DBMS_OUTPUT.PUT_LINE(V_NUMBER)
Precisamos saber o valor exato que MONTHS_BETWEEN retorna antes de pensar no arredondamento. A função conta os meses completos entre as datas e depois adiciona a fração de dias.
Por que esta fórmula: MONTHS_BETWEEN(data1, data2) = (data1 - data2) em meses. Como V_DATE1 é anterior a V_DATE2, o resultado será negativo.
De onde vem cada valor: = enunciado: TO_DATE('2025-03-27', 'YYYY-MM-DD') · = enunciado: TO_DATE('2025-07-05', 'YYYY-MM-DD')
Esquecer que a ordem importa: se inverter as datas, o resultado seria +3,258.
A variável V_NUMBER foi declarada com precisão 2, ou seja, só pode guardar números com até 2 dígitos significativos. O valor -3,258 tem mais dígitos, então o Oracle arredonda para o inteiro mais próximo.
Por que esta fórmula: O arredondamento do Oracle para NUMBER(p) segue a regra padrão: se a parte decimal for 0,5 ou mais, arredonda para cima; caso contrário, para baixo. Aqui, 0,258 é menor que 0,5, então arredonda para -3.
De onde vem cada valor: = passo 1: -3,258 meses
Achar que arredonda para -4 por ser negativo — o Oracle arredonda para o inteiro mais próximo, não para o mais distante de zero.
Resposta: -3 — alternativa B
Link permanente: /questoes/qa699059