Catégories :

Syntaxe de requête

AT | BEFORE

La clause AT ou BEFORE est utilisée pour Snowflake Time Travel. Dans une requête, elle est spécifiée dans la clause FROM immédiatement après le nom de la table et détermine le moment passé à partir duquel les données historiques sont demandées pour l’objet :

  • Le mot clé AT spécifie que la requête inclut tous les changements apportés par une instruction ou une transaction dont l’horodatage est égal au paramètre spécifié.

  • Le mot clé BEFORE spécifie que la requête se réfère à un point précédant immédiatement le paramètre spécifié.

Pour plus d’informations, voir Comprendre et utiliser la fonction « Time Travel ».

Voir aussi :

FROM

Syntaxe

SELECT ...
FROM ...
  {
   AT( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) |
   BEFORE( STATEMENT => <id> )
  }
[ ... ]
TIMESTAMP => horodatage

Spécifie une date et une heure exactes à utiliser pour Time Travel. Notez que la valeur doit être explicitement convertie en TIMESTAMP.

OFFSET => différence_heure

Spécifie la différence en secondes par rapport au temps actuel à utiliser pour Time Travel, sous la forme -NN peut être un entier ou une expression arithmétique (par exemple, -120 correspond à 120 secondes, -30*60 correspond à 1800 secondes ou 30 minutes).

STATEMENT => id

Spécifie l’ID d’une requête à utiliser comme point de référence pour Time Travel. Ce paramètre prend en charge toute instruction de l’un des types suivants :

  • DML (par ex. INSERT, UPDATE, DELETE)

  • TCL (transaction BEGIN, COMMIT)

  • SELECT

Notes sur l’utilisation

  • Les données contenues dans Snowflake sont identifiées par des horodatages qui peuvent légèrement différer de la valeur exacte de l’heure système.

  • La valeur de TIMESTAMP ou OFFSET doit être une expression constante.

  • La résolution temporelle la plus petite pour TIMESTAMP est exprimée en millisecondes.

  • Si les données demandées sont au-delà de la période de conservation de Time Travel (1 jour par défaut), l’instruction échoue.

    De plus, si les données demandées se trouvent dans la période de conservation de Time Travel, mais qu’aucune donnée historique n’est disponible (par exemple, si la période de conservation a été prolongée), l’instruction échoue.

  • Lors de l’accès aux données historiques de la table, le schéma de la table en cours est utilisé (colonnes, valeurs par défaut, etc.).

  • Les données historiques ont les mêmes exigences de contrôle d’accès que les données actuelles. Toutes les modifications sont appliquées rétroactivement.

Dépannage

Message d’erreur : Time travel data is not available for table <nom_table>

Cause

Dans certains cas, cela est dû à l’utilisation d’une chaîne dans laquelle un horodatage est attendu.

Solution

Transforme la chaîne en un horodatage.

... AT(TIMESTAMP => '2018-07-27 12:00:00')               -- wrong
... AT(TIMESTAMP => '2018-07-27 12:00:00'::TIMESTAMP)    -- right

select * from tab1 where c1 = 'This is a string', c2 = 10 and "Column 2" = 20;

Exemples

Sélectionnez les données historiques d’une table en utilisant un horodatage spécifique :

SELECT * FROM my_table AT(TIMESTAMP => 'Mon, 01 May 2015 16:20:00 -0700'::timestamp);
SELECT * FROM my_table AT(TIMESTAMP => TO_TIMESTAMP(1432669154242, 3));

Sélectionnez les données historiques d’une table datant d’il y a 5 minutes :

SELECT * FROM my_table AT(OFFSET => -60*5) AS T WHERE T.flag = 'valid';

Sélectionnez les données historiques d’une table jusqu’à, mais sans inclure les modifications apportées par la transaction spécifiée :

SELECT * FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726');

Renvoie la différence dans les données de table résultant de la transaction spécifiée :

SELECT oldt.* ,newt.*
  FROM my_table BEFORE(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS oldt
    FULL OUTER JOIN my_table AT(STATEMENT => '8e5d0ca9-005e-44e6-b858-a8f5b37c5726') AS newt
    ON oldt.id = newt.id
WHERE oldt.id IS NULL OR newt.id IS NULL;