2
votes

Connexion de BigQuery et de Google Sheets - problème de paramètre DATE

suivant 1 J'ai commencé à créer une feuille de calcul qui lit les données de BigQuery, mais je rencontre un problème de gestion des paramètres liés aux valeurs de date.

Dans la première feuille, j'ai créé 2 cellules avec 2 paramètres, le début et la fin d'un intervalle de dates, avec des valeurs appropriées. Les deux cellules sont mises en forme en tant que valeur "Date".

Dans la deuxième feuille, j'ai configuré le connecteur BigQuery, pour cet exemple, j'utilise un ensemble de données public avec des dates. bigquery-public-data.utility_eu.date_greg

Dans l'assistant de connexion BigQuery, j'ai ajouté:

SELECT *

FROM `bigquery-public-data.utility_eu.date_greg`

WHERE 
  date >= DATE_ADD(DATE("1899-12-30"), INTERVAL @DATAINIZIO DAY)
  AND date <= DATE_ADD(DATE("1899-12-30"), INTERVAL @DATAFINE DAY)

Après cette configuration, voici la requête résultante:

01/05/2019 -> 43.586
31/05/2019 -> 43.616

Je reçois une erreur directement de l'éditeur avec ce message:

> Error BigQuery: No matching signature for function DATE for argument types: INT64. Supported signatures: DATE(TIMESTAMP, [STRING]); DATE(DATETIME); DATE(INT64, INT64, INT64) at [8:14]

Autant que je sache, les cellules "date" sont récupérées sous forme de nombre, donc l'analyse directe ne fonctionne pas. Après quelques tests, j'ai compris que la valeur int donnée est le nombre que je peux obtenir pour changer le format de cellule en "nombre". Si vous convertissez la valeur de la cellule de DATE en NUMBER, vous obtenez cette valeur:

SELECT
  date,
  date_str,
  date_int

FROM `bigquery-public-data.utility_eu.date_greg` 

WHERE date > DATE(@STARTDATE) AND date < DATE(@ENDDATE)

LIMIT 10

Quel est ce nombre? Ce n'est pas des millisecondes, il augmente de 1 chaque jour suivant. Afin de créer la bonne requête capable d'analyser cet int, j'ai besoin de comprendre ce qu'est cet int (bien sûr, je peux gérer la cellule en tant que "texte" et écrire la valeur d'horodatage directement, mais je préférerais avoir le format de date natif afin que je puisse utiliser le calendrier intégré.

Ma considération (avec des mathématiques simples) est que ce nombre fait référence à un nombre de jours depuis le 30/12/1899 , mais il est très étrange (aussi, chaque date AVANT ce jour est toujours 0), donc je vous demande directement comment gérer cette valeur. En me basant sur ma compréhension du moment où le compteur de nombres démarre (30/12/1899), j'ai créé ceci requête qui ajoute le numéro récupéré de la cellule:

"STARTDATE" as "PARAMETERS!B1"
"ENDDATE" as "PARAMETERS!B2"

Cela fonctionne ... mais je pense que je fais une solution de contournement qui n'est pas la bonne façon de faire cela.

Existe-t-il également une documentation complète relative à cette connexion BigQuery fournie par Spreadsheet? Outre la présentation dans 1 Je ne trouve aucune documentation spécifique.


0 commentaires

3 Réponses :


0
votes

Quel est ce numéro? Ce n'est pas des millisecondes, il augmente de 1 chaque jour suivant.

C'est ce qu'on appelle le numéro de série qui représente le nombre de jours depuis le "tout début"
Le calendrier des dates de la feuille de calcul de Google commence le 01/01/1900 - qui est traité comme un "tout début"

Afin de créer la bonne requête capable d'analyser cet int, j'ai besoin de comprendre ce qu'est cet int

Armé des informations ci-dessus, vous pouvez ajuster votre calcul de dates pour qu'il soit synchronisé avec ce que BigQuery attend


4 commentaires

A noter également - je pense que cette fonctionnalité (feuille connectée) est encore au début de la Bêta


Je ne sais pas si la version bêta ou non, je ne parviens pas à trouver de documentations en dehors de la page de blog où la fonctionnalité est introduite. À la fin, la requête BQ que j'ai déjà faite avec date_add semble être le moyen le plus rapide de résoudre ce problème


Armé des informations ci-dessus, vous pouvez ajuster le calcul des dates pour qu'il soit synchronisé avec ce que BigQuery attend C'est ce que j'ai fait et vous pouvez le lire dans ma requête, mais j'utilise 30-12 comme point de départ , no 01-01 comme vous l'avez mentionné. Je me demandais si c'était la bonne façon de répondre à ce genre de besoin.


J? ai compris! D'une manière ou d'une autre, j'ai totalement manqué la dernière partie de votre question et je me suis concentré sur la question au milieu de votre message que je pensais être la question principale. Quoi qu'il en soit - oui - je ne sais pas pourquoi mais techniquement, utiliser "1899-12-30" dans la requête comme vous l'avez fait est correct



0
votes

Vous avez mentionné que vos champs sont déjà au format Date, peut-être que vous effectuez une analyse supplémentaire dans votre requête.

Essayez de le faire sans les fonctions DATE.

J'ai également trouvé cet autre document, non seulement lié à la connexion, mais qui pourrait être utile: Obtenir des informations à partir de feuilles de calcul avec BigQuery .


1 commentaires

Votre lien est lié au type d'action opposé, à savoir l'accès aux données de la feuille à partir de BigQuery, en tant que source de données fédérée. J'utilise le nouveau connecteur intégré à Sheet pour récupérer des données de BigQuery. Il n'y a pas d'analyse dans la requête, j'utilise uniquement le paramètre



1
votes

Les feuilles de calcul (Google, Excel, ...) stockent les dates sous forme de jours écoulés depuis une date de début avec une fraction de jour représentant l'heure.

De ici : "Excel stocke les dates et les heures sous forme de nombre représentant le nombre de jours depuis 1900-janv.-0, plus une fraction d'une journée de 24 heures: ddddd.tttttt. C'est ce qu'on appelle une date de série, ou date-heure de série. "

Vous devez maintenant filtrer par date sur votre requête:

  1. Dans la requête, vous pouvez utiliser DATE_ADD pour ajouter votre nombre de jours (valeur de cellule) à la date de base. (Attention, DATE_ADD prend INT, et la valeur de la date est float donc nécessite une conversion préalable).
  2. (de préférence) sur votre feuille de calcul, vous utilisez TEXT (cellule, "aaaa-mm-jj") afin que vous puissiez ensuite utiliser DATE () dans la requête BigQuery.

J'utilise la deuxième méthode comme, bien que vous ayez besoin de cette cellule supplémentaire (à moins que vous ne stockiez directement la date sous la forme AAAA-MM-JJ; garde la requête plus propre que d'avoir un cast et date_add dedans. Problème 1904 "expliqué dans le lien ci-dessus.


0 commentaires