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
où h.visitStartTime
est une époque INT64
et d.interval_start_time_utc
et d.interval_end_time_utc
sont des TIMESTAMP
s 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?
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
Avec sql standard vous pouvez en utiliser un, selon la précision:
DATE_FROM_UNIX_DATE
- des jours Epoch à ce jourTIMESTAMP_SECONDS
- des secondes d'époque à l'horodatageTIMESTAMP_MILLIS
- de millisecondes Epoch à horodatageTIMESTAMP_MICROS
- de l'époque en microsecondes à l'horodatageVoir 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