Questão nº 38
Questão de Tecnologia da Informação · FCC TRT-1 2025 (nº 38)
Considere o seguinte trecho de código em PL/SQL:
```sql
SELECT nome, FLOOR(MONTHS_BETWEEN(SYSDATE, data_admissao) / 12) AS anos_servico,
MOD(MONTHS_BETWEEN(SYSDATE, data_admissao), 12) AS meses_servico
FROM funcionarios
WHERE status = 'Ativo';
```
Ao ser executado em condições ideais, este comando
- Aerra ao calcular o tempo de serviço, pois deveria ter sido usado `EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM data_admissao)`, uma vez que `EXTRACT` já retorna a diferença correta de anos e meses.
- Berra ao calcular o tempo de serviço, pois deveria ter sido usado `DATEDIFF(YEAR, data_admissao, SYSDATE)`, que retorna diretamente os anos completos.
- Ccalcula o tempo de serviço dos funcionários ativos somando diretamente os meses obtidos pela função `MONTHS_BETWEEN`, sem necessidade de divisão ou modulação.
- Dcalcula o tempo de serviço dos funcionários ativos, obtendo a diferença total de meses entre a data atual `SYSDATE` e `data_admissao`, convertendo os valores em anos e meses utilizando `FLOOR` e `MOD`. (alternativa correta)
- Eerra ao calcular o tempo de serviço, pois deveria ter sido utilizado apenas `ROUND(MONTHS_BETWEEN(SYSDATE, data_admissao) / 12)`, pois não há necessidade de calcular separadamente os anos e meses.
Resposta comentada
Gabarito Alternativa D
Para calcular o tempo de serviço em anos e meses, primeiro encontramos a diferença total de meses entre as duas datas. Depois, usamos a divisão inteira (FLOOR) para obter os anos completos e o resto da divisão (MOD) para encontrar os meses restantes.
- (A) Incorreta:
EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM data_admissao)calcula apenas a diferença entre os números dos anos, ignorando completamente os meses e dias. Por exemplo, um funcionário admitido em 31/12/2020 e a data atual sendo 01/01/2023 resultaria em 3 anos, o que está incorreto para apenas um dia de serviço. Essa é uma armadilha comum que não considera a precisão necessária para tempo de serviço. - (B) Incorreta: A função
DATEDIFFnão é padrão no PL/SQL do Oracle. Além disso, mesmo em sistemas onde existe,DATEDIFF(YEAR, ...)geralmente sofre do mesmo problema de precisão da alternativa A, apenas subtraindo os números dos anos. - (C) Incorreta: O comando não calcula o tempo de serviço somando diretamente os meses. Ele utiliza explicitamente a divisão (
/ 12) e a modulação (MOD) para converter o total de meses em anos e meses, como pode ser visto no código. - (D) Correta: O comando calcula a diferença total de meses entre a data atual (
SYSDATE) e a data de admissão (data_admissao) usandoMONTHS_BETWEEN. Em seguida,FLOOR(MONTHS_BETWEEN(...) / 12)obtém o número de anos completos (a parte inteira da divisão), eMOD(MONTHS_BETWEEN(...), 12)obtém o número de meses restantes após os anos completos terem sido calculados. Isso fornece uma representação precisa do tempo de serviço em anos e meses. - (E) Incorreta: Usar apenas
ROUND(MONTHS_BETWEEN(...) / 12)arredondaria o total de anos, perdendo a informação detalhada dos meses restantes. Por exemplo, 11.5 meses de serviço seriam arredondados para 1 ano, sem indicar os meses. O objetivo é mostrar anos e meses separadamente, o queROUNDnão faz.
Fonte: FCC TRT-1 2025 Analista Judiciário - Área Apoio Especializado - Especialidade Tecnologia da Informação (Caderno Tipo 004). Reproduzida para fins de estudo.