Questão de Banco de Dados — Bancos de Dados Espaciais — FGV 2024
- Código
- fg165274
- Banca
- FGV
- Órgão
- INPE
- Ano
- 2024
- Cargo
- Tecno P1 ( )
- Ainteger.
- Binterval.
- Ctimestamp.
- Dreal.
- Etime.
GabaritoB — interval.
time_gapGabarito: letra B. O atributo time_gap é do tipo interval, porque a expressão lead(t) over (...) - t subtrai dois valores timestamp, e no PostgreSQL a subtração entre dois timestamps produz um valor do tipo interval — que representa uma duração de tempo. É exatamente essa regra de tipagem da subtração que a questão cobra.
A questão mistura duas consultas SQL sobre uma tabela taxi com extensão espacial PostGIS. A primeira consulta usa uma janela nomeada p para calcular, por táxi e por dia, o horário máximo (max(t) over p) e mínimo (min(t) over p) — ou seja, a chegada e a partida de cada dia. A segunda consulta, que é a que interessa para a pergunta, usa a função de janela lead() para olhar a próxima linha dentro da partição de cada táxi, ordenada pelo tempo t.
A linha 10 é o coração da questão:
lead(t) over (partition by taxi order by t) - t as time_gapA função lead(t) retorna o valor de t da próxima linha na janela (a próxima leitura de GPS daquele táxi, na ordem cronológica). Subtraindo o t da linha atual, obtemos o intervalo de tempo entre duas leituras consecutivas — o time_gap. A pergunta é: qual o tipo desse resultado?
No PostgreSQL, a subtração entre dois valores do tipo timestamp (ou timestamp with time zone) sempre retorna um valor do tipo interval. Isso é uma regra fundamental da aritmética de datas e horas: timestamp - timestamp = interval. O interval representa uma duração — anos, meses, dias, horas, minutos, segundos — e é exatamente o que faz sentido para um "gap" de tempo entre duas leituras.
Para fixar: a subtração de dois timestamp gera interval; a subtração de dois date também gera interval; a soma de um timestamp com um interval gera timestamp; e a subtração de um interval de um timestamp gera timestamp. A pegadinha da banca está em confundir o time_gap (que é uma duração) com um instante no tempo (timestamp ou time) ou com um número puro (integer ou real).
A banca explora a confusão entre "instante no tempo" e "duração de tempo". O time_gap é a diferença entre dois horários — uma duração —, não um horário em si. Por isso timestamp (letra C) e time (letra E) são distratores fortes: o candidato vê t (que é timestamp) e acha que o resultado também é timestamp. Mas a operação lead(t) - t transforma o tipo: o resultado de subtrair dois timestamps é sempre interval. Guarde a regra: timestamp - timestamp = interval.
integer é um tipo numérico inteiro. A subtração de dois timestamp não produz um número inteiro — produz um interval. O integer seria o tipo de extract(day from t), que extrai o dia como um número, mas não o tipo de time_gap. A banca coloca integer como distrator para quem acha que a diferença de tempo é contada em unidades inteiras (dias, horas), sem perceber que o PostgreSQL devolve um tipo próprio para durações.
A expressão lead(t) over (...) - t subtrai dois valores timestamp. No PostgreSQL, a subtração entre dois timestamp retorna um valor do tipo interval, que representa uma duração de tempo (ex.: 1 day 02:30:00). O time_gap é exatamente isso: o intervalo de tempo entre duas leituras consecutivas de um mesmo táxi. É o tipo correto e o único que faz sentido semanticamente para a coluna.
timestamp representa um instante específico no tempo (data + hora). O time_gap não é um instante — é a diferença entre dois instantes. Subtrair dois timestamps nunca resulta em timestamp; resulta em interval. A letra C é o distrator mais perigoso, pois o candidato pode pensar que, como t é timestamp, o resultado da operação também seria. Mas a operação de subtração muda o tipo do resultado.
real é um tipo numérico de ponto flutuante. Não há nenhuma operação na expressão que produza um número real. A subtração de timestamps gera interval, não um número. O real seria plausível se a expressão calculasse, por exemplo, uma distância numérica, mas para tempo o PostgreSQL usa o tipo interval.
time representa apenas a hora do dia (sem data), como 14:30:00. O time_gap não é uma hora do dia — é uma duração. Além disso, a subtração de dois timestamp não produz time. A letra E confunde "hora" com "intervalo de tempo", que são conceitos distintos no PostgreSQL: time é um instante do dia, interval é uma quantidade de tempo.
Gabarito: letra B — o atributo time_gap é do tipo interval, pois resulta da subtração de dois valores timestamp no PostgreSQL.
Link permanente: /questoes/fg165274