Pular para o conteúdo principal

Questão de Banco de Dados — SGBD - Sistema de Gerenciamento de Banco de Dados — FGV 2024

Banco de DadosSGBD - Sistema de Gerenciamento de Banco de Dados
Código
fg086316
Banca
FGV
Órgão
INPE
Ano
2024
Nível
Superior
Cargo
Tecnologista Pleno I - Especificação, Projeto e Arquitetura de Sistemas de Software para o Processamento e Distribuição de Imagens de Sensoriamento Remoto
Considere a seguinte estrutura de dados criada em SGBD PostgreSQL com extensão espacial PostGIS:Imagem associada para resolução da questãoFoi elaborado o seguinte código para ser executado na estrutura definida.Q12.png 418×326De acordo com o código supracitado, o atributo time_gap é do tipo
  1. Ainteger.
  2. Binterval.
  3. Ctimestamp.
  4. Dreal.
  5. Etime.
Revelar gabarito e comentário

GabaritoB — interval.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

PostgreSQL e PostGIS: tipos de dados temporais

Gabarito: letra B. O atributo time_gap é do tipo interval porque o código utiliza a função ST_Time (ou operação equivalente) que retorna a diferença entre dois timestamps, e essa diferença é representada no PostgreSQL pelo tipo interval — que armazena durações de tempo. As demais alternativas (integer, timestamp, real, time) não representam corretamente uma duração entre dois instantes.

O PostgreSQL possui uma família de tipos de dados temporais que costuma gerar confusão em provas: timestamp (armazena um instante específico, com data e hora), time (armazena apenas a hora do dia), date (apenas a data) e interval (armazena uma duração, ou seja, a diferença entre dois instantes). A pegadinha clássica da banca é justamente trocar o tipo que representa um instante (timestamp/time) pelo tipo que representa uma duração (interval).

Quando você subtrai dois valores timestamp no PostgreSQL, o resultado é automaticamente do tipo interval. Por exemplo, '2024-01-01 10:00:00'::timestamp - '2024-01-01 09:30:00'::timestamp retorna 00:30:00 como um interval. O mesmo vale para a subtração de dois valores time. Essa é a regra fundamental: a diferença entre dois instantes é sempre uma duração, e no PostgreSQL essa duração é armazenada como interval.

No contexto do PostGIS, a extensão espacial do PostgreSQL, a função ST_Time (ou ST_TimeStamp) é usada para extrair o componente de tempo de uma geometria ou para calcular diferenças temporais. Quando o código calcula a diferença entre dois timestamps (por exemplo, o tempo de chegada e o tempo de partida de um veículo em um waypoint), o resultado é um interval. O atributo time_gap foi criado justamente para armazenar essa diferença, portanto seu tipo é interval.

A distinção crucial que decide esta questão é: instante vs. duração. timestamp e time representam pontos na linha do tempo (instantes), enquanto interval representa um espaço entre dois pontos (duração). A banca explora exatamente essa confusão: o candidato que vê "time" no nome do atributo (time_gap) pode ser levado a escolher time, mas o sufixo "gap" (lacuna, intervalo) já indica que se trata de uma duração. Guarde essa fronteira: sempre que o código calcular uma diferença entre datas/horas, o tipo resultante será interval.

Tipos temporais no PostgreSQL
  • 1Instante (ponto na linha do tempo)
    • timestamp (data + hora)
    • time (hora do dia)
    • date (apenas data)
  • 2Duração (espaço entre dois pontos)
    • interval
    • Resultado da subtração de dois instantes
  • 3Regra fundamental
    • Subtração de timestamps → interval
    • Subtração de times → interval
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

integer armazena números inteiros. A diferença entre dois timestamps não é um número inteiro, mas uma duração com componentes de dias, horas, minutos e segundos. Embora seja possível converter um interval em um número (por exemplo, extraindo o total de segundos), o tipo nativo do resultado da subtração é interval, não integer.

Alternativa B — ✅ Correta ⟵ GABARITO

O tipo interval é exatamente o que representa uma duração de tempo no PostgreSQL. A subtração entre dois valores timestamp (ou time) retorna um interval, e é isso que o atributo time_gap armazena — a diferença temporal entre dois eventos. O nome do atributo reforça: "gap" significa lacuna, intervalo, ou seja, uma duração.

Alternativa C — ❌ Incorreta

timestamp armazena um instante específico (data e hora). O atributo time_gap não armazena um instante, mas a diferença entre dois instantes. Se o código calcula time_gap como a subtração entre dois timestamps, o resultado é um interval, não um novo timestamp.

Alternativa D — ❌ Incorreta

real é um tipo de ponto flutuante para números com casas decimais. Não é adequado para armazenar durações de tempo, que possuem componentes de dias, horas, minutos e segundos. O PostgreSQL possui o tipo interval especificamente para essa finalidade.

Alternativa E — ❌ Incorreta

time armazena apenas a hora do dia (sem data), representando um instante dentro de um dia. O atributo time_gap representa uma duração, não um instante. A confusão entre time (instante) e interval (duração) é a armadilha central desta questão — o nome do atributo contém "time", mas o tipo correto é interval.

NÃO CAIA NESSA!

A banca explora a confusão entre time e interval. O nome do atributo (time_gap) contém a palavra "time", induzindo o candidato a escolher a alternativa E. Mas "gap" significa lacuna/intervalo — ou seja, uma duração. A regra é: subtração de dois instantes = interval. Sempre que o código calcular uma diferença entre datas ou horas, o tipo resultante será interval, nunca time ou timestamp.

PEGA ESSA DICA!

Para fixar, lembre-se da tríade temporal do PostgreSQL: timestamp = instante (data + hora), time = hora do dia, interval = duração. Na prova, ao ver uma operação de subtração entre dois valores temporais, marque interval sem hesitar. Se a alternativa trouxer timestamp ou time como resultado de uma subtração, está errada.

Gabarito: letra B

Link permanente: /questoes/fg086316