web-dev-qa-db-fra.com

BigQuery: convertir Epoch en TIMESTAMP

J'essaie de joindre à distance deux tables, comme ça

SELECT *
FROM main_table h
INNER JOIN
    test.delay_pairs d
ON
    d.interval_start_time_utc < h.visitStartTime
    AND h.visitStartTime < d.interval_end_time_utc

h.visitStartTime est une époque INT64 et d.interval_start_time_utc et d.interval_end_time_utc sont des TIMESTAMPs appropriés.

Ce qui précède échoue avec

No matching signature for operator < for argument types: TIMESTAMP, INT64. Supported signature: ANY < ANY

L'encapsulation de h.visitStartTime Dans TIMESTAMP() ni CAST(d.interval_start_time_utc AS INT64) ne fonctionne. Comment puis-je rendre les deux comparables dans le dialecte SQL standard de BigQuery?

12
RoyalTS

Vous pouvez utiliser fonctions de conversion d'horodatage comme TIMESTAMP_SECONDS, TIMESTAMP_MILLIS, TIMESTAMP_MICROS

par exemple, en supposant que votre h.visitStartTime est en microsecondes depuis l'époque Unix

SELECT *
FROM main_table h
INNER JOIN test.delay_pairs d
ON d.interval_start_time_utc < TIMESTAMP_MICROS(h.visitStartTime)
AND TIMESTAMP_MICROS(h.visitStartTime) < d.interval_end_time_utc  
21
Mikhail Berlyant

Avec sql standard vous pouvez en utiliser un, selon la précision:

  • DATE_FROM_UNIX_DATE - des jours Epoch à ce jour
  • TIMESTAMP_SECONDS - des secondes d'époque à l'horodatage
  • TIMESTAMP_MILLIS - de millisecondes Epoch à horodatage
  • TIMESTAMP_MICROS - de l'époque en microsecondes à l'horodatage

Voir la documentation ici: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#timestamp_seconds

Avec l'héritage sql, vous pouvez simplement utiliser la fonction TIMESTAMP et multiplier ou diviser par 1000 pour l'amener au type d'époque requis:

SELECT 
  TIMESTAMP(Epoch_in_millis / 1000) AS datetime
FROM 
  my_table
6
Bulat