

# Hacer consultas de viaje en el tiempo y de viaje de versión
<a name="querying-iceberg-time-travel-and-version-travel-queries"></a>

Cada tabla de Apache Iceberg mantiene un manifiesto con versiones de los objetos de Amazon S3 que contiene. Las versiones anteriores del manifiesto se pueden usar para las consultas de viaje en el tiempo y de viaje de versión.

Las consultas de viaje en el tiempo de Athena consultan en Amazon S3 para obtener los datos históricos de una instantánea coherente a partir de una fecha y hora especificas. Las consultas de viaje de versión en Athena consultan Amazon S3 para obtener datos históricos a partir de un ID de instantánea especificado.

## Consultas de viaje en el tiempo
<a name="querying-iceberg-time-travel-queries"></a>

Para ejecutar una consulta de viaje en el tiempo, use `FOR TIMESTAMP AS OF timestamp` después del nombre de la tabla en la instrucción `SELECT`, como en el siguiente ejemplo.

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

La hora del sistema que se especificará para viajar puede ser una marca temporal o una marca temporal con una zona horaria. Si no se especifica, Athena considera que el valor es una marca de tiempo en el huso horario UTC.

En el siguiente ejemplo de consultas de viaje en el tiempo, se seleccionan los datos de CloudTrail para la fecha y 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 viaje de versión
<a name="querying-iceberg-version-travel-queries"></a>

Para ejecutar una consulta de viaje de versiones (es decir, ver una instantánea coherente a partir de una versión especificada), utilice `FOR VERSION AS OF version` después del nombre de la tabla en la instrucción `SELECT`, como en el siguiente ejemplo.

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

El parámetro de la *versión* es el ID de instantánea `bigint` asociado a una versión de la tabla de Iceberg.

En el siguiente ejemplo de consulta de viaje de versiones, se seleccionan los datos de la versión especificada.

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

**nota**  
Las cláusulas `FOR SYSTEM_TIME AS OF` y `FOR SYSTEM_VERSION AS OF` de la versión 2 del motor de Athena se han sustituido por las cláusulas `FOR TIMESTAMP AS OF` y `FOR VERSION AS OF` de la versión 3 del motor de Athena.

### Recuperación del id. de la instantánea
<a name="querying-iceberg-table-snapshot-id"></a>

Puede utilizar la clase [SnapshotUtil](https://iceberg.apache.org/javadoc/1.6.0/org/apache/iceberg/util/SnapshotUtil.html) de Java proporcionada por Iceberg para recuperar el ID de una instantánea de Iceberg, como se muestra en el siguiente ejemplo.

```
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);
```

## Combinación de viajes en el tiempo y de versión
<a name="querying-iceberg-combining-time-and-version-travel"></a>

Se puede usar la sintaxis de viaje en el tiempo y de versión en la misma consulta para especificar diferentes condiciones de tiempo y de control de versiones, como en el siguiente ejemplo.

```
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)
```