

# Executar consultas de viagem no tempo e viagem nas versões
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

Toda tabela Apache Iceberg mantém um manifesto versionado dos objetos do Amazon S3 que contém. Versões anteriores do manifesto podem ser usadas para consultas de viagem no tempo e de viagem nas versões.

As consultas de viagem no tempo no Athena consultam o Amazon S3 para obter dados históricos usando um snapshot consistente a partir de uma data e hora especificadas. As consultas de viagem nas versões do Athena consultam o Amazon S3 para obter dados históricos a partir de um ID de snapshot especificado.

## Consultas de viagem no tempo
<a name="querying-iceberg-time-travel-queries"></a>

Para executar uma consulta de viagem no tempo, use `FOR TIMESTAMP AS OF timestamp` após o nome da tabela na instrução `SELECT`, como no exemplo a seguir.

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF timestamp
```

O horário do sistema a ser especificado para a viagem é um carimbo de data/hora ou uma carimbo de data/hora com um fuso horário. Se não for especificado, o Athena considera o valor como um carimbo de data/hora no horário UTC.

O exemplo a seguir de consultas de viagem no tempo selecionam dados do CloudTrail para a data e hora especificadas.

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2020-01-01 10:00:00 UTC'
```

```
SELECT * FROM iceberg_table FOR TIMESTAMP AS OF (current_timestamp - interval '1' day)
```

## Consultas de viagem nas versões
<a name="querying-iceberg-version-travel-queries"></a>

Para executar uma consulta de viagem nas versões (ou seja, exibir um snapshot consistente a partir de uma versão especificada), use `FOR VERSION AS OF version` após o nome da tabela na instrução `SELECT`, como no exemplo a seguir.

```
SELECT * FROM [db_name.]table_name FOR VERSION AS OF version         
```

O parâmetro *versão* é o ID do snapshot `bigint` associado a uma versão da tabela Iceberg.

O exemplo de consulta de viagem nas versões a seguir seleciona dados para a versão especificada.

```
SELECT * FROM iceberg_table FOR VERSION AS OF 949530903748831860
```

**nota**  
As cláusulas `FOR SYSTEM_TIME AS OF` e `FOR SYSTEM_VERSION AS OF` na versão 2 do mecanismo do Athena foram substituídas pelas cláusulas `FOR TIMESTAMP AS OF` e `FOR VERSION AS OF` na versão 3 do mecanismo do Athena.

### Recuperar ID do snapshot
<a name="querying-iceberg-table-snapshot-id"></a>

Você pode usar a classe Java [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) fornecida pelo Iceberg para recuperar o ID do snapshot do Iceberg, como no exemplo a seguir.

```
import org.apache.iceberg.Table;
import org.apache.iceberg.aws.glue.GlueCatalog;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.util.SnapshotUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

Catalog catalog = new GlueCatalog();

Map<String, String> properties = new HashMap<String, String>();
properties.put("warehouse", "s3://amzn-s3-demo-bucket/my-folder");
catalog.initialize("my_catalog", properties);

Date date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").parse("2022/01/01 00:00:00");
long millis = date.getTime();

TableIdentifier name = TableIdentifier.of("db", "table");
Table table = catalog.loadTable(name);
long oldestSnapshotIdAfter2022 = SnapshotUtil.oldestAncestorAfter(table, millis);
```

## Combinar viagens no tempo e viagens nas versões
<a name="querying-iceberg-combining-time-and-version-travel"></a>

Você pode usar a sintaxe de viagem no tempo e viagem nas versões na mesma consulta para especificar condições diferentes de temporização e versionamento, como no exemplo a seguir.

```
SELECT table1.*, table2.* FROM 
  [db_name.]table_name FOR TIMESTAMP AS OF (current_timestamp - interval '1' day) AS table1 
  FULL JOIN 
  [db_name.]table_name FOR VERSION AS OF 5487432386996890161 AS table2 
  ON table1.ts = table2.ts 
  WHERE (table1.id IS NULL OR table2.id IS NULL)
```